我有一个为md5sums分配数字的文件,如下所示:
0 0000001732816557DE23435780915F75
1 00000035552C6F8B9E7D70F1E4E8D500
2 00000051D63FACEF571C09D98659DC55
3 0000006D7695939200D57D3FBC30D46C
4 0000006E501F5CBD4DB56CA48634A935
5 00000090B9750D99297911A0496B5134
6 000000B5AEA2C9EA7CC155F6EBCEF97F
7 00000100AD8A7F039E8F48425D9CB389
8 0000011ADE49679AEC057E07A53208C1
另一个文件每行包含三个md5sum,如下所示:
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
是具有整数和md5sumsfile2.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
分别为1万线长,这种解决方案和埃德莫顿awk
-只有解决方案需要大约时间在我的系统相同的长度。不管使用哪种方法,我的系统都要花很长时间才能解决1.4亿行的问题,但是我为1000万行的文件运行了一个测试用例。
我曾假设,依赖的解决方案sort
(在需要时会自动使用临时文件)对于大量的行应该更快,因为这将是O(N log N)运行时,而一种解决方案需要为每个重新读取映射文件如果两个文件的大小相似,则输入的行将为O(N ^ 2)。
计时结果
对于两个候选解决方案的性能关系,我的假设对于我尝试的测试用例来说是错误的。在我的系统上,sort
基于-解决方案和-awk
仅解决方案彼此花费相似的时间(在30%之内)用于100万行和1000万行输入文件awk
中的每一个,并且-唯一解决方案在每种情况下都更快。我不知道当输入文件的大小增加10倍以上时,这种关系是否成立。
奇怪的是,使用这两个解决方案,一千万行的问题花费的时间大约是一百万行的问题的十倍,这使我感到困惑,因为我期望这两个解决方案都与文件长度呈非线性关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句