我有一个大文件(40亿行),每行包含一个单词。我想查找唯一单词列表和相应的计数。
我试过了:
sort largefile |uniq -c >outfile
但它仍在运行且没有输出。
然后我尝试了: awk '!arr[$1]++' largefile >outfile
但它不会打印计数。如何使用awk打印计数呢?或任何其他可以处理大文件的替代方法。
编辑:文件中有大约1700万个唯一单词。
答案 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";
}