一旦你有一个包含所有唯一的排序文件
Query <TAB> LocationCode <TAB> IPAddress <NEWLINE>
你可以:
awk -F '\t' 'NR == 1 {q=$1; l=$2; count=0}
q == $1 && l == $2{count++}
q != $1 || l != $2{printf "%s\t%s\t%d\n", q, l, count; q=$1; l=$2; count=1}
END{printf "%s\t%s\t%d\n", q, l, count}' sorted_uniq_file
要做到这一点sorted_uniq_file
,天真的方法可以是:
sort -u dir/* > sorted_uniq_file
但这可能会很长并且会消耗内存。
更快的选择(和更少的内存消耗)可能是尽快消除重复,先排序,然后合并。这需要一个用于排序文件的临时空间,让我们使用一个名为的目录sorted
:
mkdir sorted;
for f in dir/*; do
sort -u $f > sorted/$f
done
sort -mu sorted/* > sorted_uniq_file
rm -rf sorted
如果上面的解决方案达到了一些外壳或排序限制(扩展dir/*
、 或sorted/*
或 的参数数量sort
):
mkdir sorted;
ls dir | while read f; do
sort -u dir/$f > sorted/$f
done
while [ `ls sorted | wc -l` -gt 1 ]; do
mkdir sorted_tmp
ls sorted | while read f1; do
if read f2; then
sort -mu sorted/$f1 sorted/$f2 > sorted_tmp/$f1
else
mv sorted/$f1 sorted_tmp
fi
done
rm -rf sorted
mv sorted_tmp sorted
done
mv sorted/* sorted_uniq_file
rm -rf sorted
上面的解决方案可以优化为同时合并超过 2 个文件。