如何在大文件中查找唯一行?

时间:2013-08-13 00:34:41

标签: linux bash shell sorting awk

我有一个大文件(40亿行),每行包含一个单词。我想查找唯一单词列表和相应的计数。

我试过了:

sort largefile |uniq -c >outfile

但它仍在运行且没有输出。

然后我尝试了:

awk '!arr[$1]++' largefile >outfile

但它不会打印计数。如何使用awk打印计数呢?或任何其他可以处理大文件的替代方法。

编辑:文件中有大约1700万个唯一单词。

4 个答案:

答案 0 :(得分:3)

你的第一个例子没问题。试着做:

sort largefile | uniq -c

这需要一些时间。

答案 1 :(得分:3)

uniq是要走的路,但是40亿行只是很多行。如果您经常需要这些信息,我会设置一个数据库并导入行。这将加速基于索引的查询。但是,40亿行是很多行

答案 2 :(得分:2)

使用split -l 1000000预处理文件,将文件拆分为40个1,000,000行文件,使用sort -u对它们进行排序。将它们合并回一个大文件,再次对它进行排序。

## if you use just this, you need gawk 4.1
#
gawk '{key[$0]++;} END { for( word in key ) { print key[word] "\t" word }}' bigfile


cd to directory with bigfile
split -l 1000000 bigfile aa, small    ## makes smallaa, smallab, etc.

for files in small*
do
  echo "Sorting file $files"
  sort -u $files -o $files.srt
done

sort -m *.srt -o bigagain
sort -u bigagain > smallish

now have words but no counts.
gawk '{key[$0]++;}' smallish bigfile   # or better yet

答案 3 :(得分:1)

文件有多大?你期待多少独特的单词?在大多数情况下,您的sort | uniq解决方案是一个良好的开端,但很明显,如果文件太大,那就不好了。将哈希中的每个单词保存的Perl脚本可能对您有用。

这是未经测试的内存,所以它可能有一堆错误......

my %words = ();
open(IN, "<", "yourfile") or die "Arrgghh file didn't open: $!";
while(<IN>) {
    chomp;
    $words{$_}++;
}
close(IN);
for my $k in (keys %words) {
    print "$k $words{$k}\n";
}