我有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,上面的命令等)但是当文件超过例如文件时,i / o会降低到令人难以置信的水平。 1000列。我需要帮助,感谢一百万小时!
答案 0 :(得分:1)
好吧这是迄今为止我能制作的最快的代码,它适用于转置和“cat”输入。如前所述,“cat”-ed input“>>”工作正常,但“粘贴”或“pr”代码给噩梦贴上另一列,比如+ 1GB文件,这就是我们需要转置的原因。例如 每个原始文件看起来像
1 2 3 4
... 如果我们将第一个文件转置并转发给其他人,则代码的输入将如下所示:
1 2 3 4 .. 1 1 2 4 .. 1 1 1 4 ..
代码将返回原始的“又名重新转贴的粘贴”格式,其中包含洗牌行的次要细节
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]}}}