加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

awk关联数组快速增长

发布时间:2020-12-14 02:03:28 所属栏目:Linux 来源:网络整理
导读:我有一个文件,将数字分配给md5sums,如下所示: 0 0000001732816557DE23435780915F751 00000035552C6F8B9E7D70F1E4E8D5002 00000051D63FACEF571C09D98659DC553 0000006D7695939200D57D3FBC30D46C4 0000006E501F5CBD4DB56CA48634A9355 00000090B9750D99297911A
我有一个文件,将数字分配给md5sums,如下所示:

0   0000001732816557DE23435780915F75
1   00000035552C6F8B9E7D70F1E4E8D500
2   00000051D63FACEF571C09D98659DC55
3   0000006D7695939200D57D3FBC30D46C
4   0000006E501F5CBD4DB56CA48634A935
5   00000090B9750D99297911A0496B5134
6   000000B5AEA2C9EA7CC155F6EBCEF97F
7   00000100AD8A7F039E8F48425D9CB389
8   0000011ADE49679AEC057E07A53208C1

另一个文件在每行中包含三个md5sums,如下所示:

00000035552C6F8B9E7D70F1E4E8D500    276EC96E149571F8A27F4417D7C6BC20    9CFEFED8FB9497BAA5CD519D7D2BB5D7
00000035552C6F8B9E7D70F1E4E8D500    44E48C092AADA3B171CE899FFC6943A8    1B757742E1BF2AA5DB6890E5E338F857

我想要的是用第一个文件的整数替换第二个文件中的第一个和第三个md5sums.目前我正在尝试以下awk脚本:

awk '{OFS="t"}FNR==NR{map[$2]=$1;next}
{print map[$1],$2,map[$3]}' mapping.txt relation.txt

问题是尽管第一个文件在硬盘驱动器上仅为5.7g,但脚本需要更多的16g内存.

解决方法

这个问题可以解决,如下所示(file1.txt是包含整数和md5sums的文件,而file2.txt是包含三列md5sums的文件)??:

#!/bin/sh
# First sort each of file 1 and the first and third columns of file 2 by MD5
awk '{ print $2 "t" $1}' file1.txt | sort >file1_n.txt
# Before we sort the file 2 columns,we number the rows so we can put them
# back into the original order later
cut -f1 file2.txt | cat -n - | awk '{ print $2 "t" $1}' | sort >file2_1n.txt
cut -f3 file2.txt | cat -n - | awk '{ print $2 "t" $1}' | sort >file2_3n.txt
# Now do a join between them,extract the two columns we want,and put them back in order
join -t'    ' file2_1n.txt file1_n.txt | awk '{ print $2 "t" $3}' | sort -n | cut -f2 >file2_1.txt
join -t'    ' file2_3n.txt file1_n.txt | awk '{ print $2 "t" $3}' | sort -n | cut -f2 >file2_3.txt
cut -f2 file2.txt | paste file2_1.txt - file2_3.txt >file2_new1.txt

对于file1.txt和file2.txt都是100万行的情况,这个解决方案和Ed Morton的awk-only解决方案在我的系统上花费的时间大致相同.我的系统将花费很长时间来解决1.4亿行的问题,无论使用何种方法,但我为1000万行的文件运行了一个测试用例.

我假设依赖于排序的解决方案(在需要时自动使用临时文件)对于大量的行应该更快,因为它将是O(N log N)运行时,而重新读取映射文件的解决方案如果两个文件的大小相似,则输入的每一行都是O(N ^ 2).

计时结果

我对两个候选解决方案的性能关系的假设对于我尝试过的测试用例来说是错误的.在我的系统上,基于排序的解决方案和仅awk解决方案为100万和1000万行输入文件中的每一个采用了相似(在30%以内)的时间量,每个解决方案的解决方案速度更快案件.当然,当输入文件大小超过10倍时,我不知道这种关系是否会成立.

奇怪的是,1000万线路问题花了大约10倍的时间来运行这两个解决方案作为100万线路问题,这让我感到困惑,因为我预计两种解决方案都会出现与文件长度的非线性关系.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读