1

我有 10k 个文件,每个文件有 80k 行,需要比较,并且 - 删除重复的行或将它们替换为“0”。超快,因为我必须做 +1000 次。

对于少于 100 行的文件,以下脚本足够快。现在 tcsh

import csv
foreach file ( `ls -1 *` )
split -l 1 ${file} ${file}.
end
find *.* -type f -print0 | xargs -0 sha512sum | awk '($1 in aa){print $2}(!($1 in  aa)){aa[$1]=$2}' | xargs -I {} cp rowzero {} 
cat ${file}.* > ${file}.filtered

其中“rowzero”只是一个带有...零的文件。我已经尝试过python,但还没有找到快速的方法。我尝试粘贴它们并做所有快速的事情(awk、sed、上面的命令等),但是当文件超过例如 1000 列时,i/o 会减慢到令人难以置信的水平。我需要帮助,谢谢一百万小时!

4

1 回答 1

1

好的,这是迄今为止我可以制作的最快的代码,它适用于转置和“猫”输入。如前所述,“cat”-ed 输入“>>”可以正常工作,但是“paste”或“pr”代码会让人做噩梦,比如在 +1GB 文件中粘贴另一列,这就是我们需要转置的原因。例如每个原始文件看起来像

1
2
3
4

...如果我们将第一个文件与其他文件一起转置和 cat ,则代码的输入将如下所示:

1 2 3 4 ..
1 1 2 4 ..
1 1 1 4 ..

代码将返回原始的“aka retransposed paste”格式,其中包含洗牌行的次要细节

1
1 2
1 2 3
2 3 4
..

重复的行被有效地删除。在代码下方,

但是代码不通用!它仅适用于 1 位整数,因为 awk 数组索引未排序。有人可以帮忙概括一下吗?谢谢!

{for(ii=1;ii<=NF;ii++){aa[ii,$ii]=$ii}}END{mm=1; for (n in aa) {split(n, bb, SUBSEP); if (bb[1]==mm){cc=bb[2]; printf ( "%2s", cc)}else{if (mm!=bb[1]){printf "\n%2s", bb[2] }; mm=bb[1]}}}

于 2013-01-27T17:55:54.447 回答