I use sort | uniq -c | sort -n
多年来,但今天它失败了,因为我的输入文件是 10 GB 并且我的/tmp
宽度为 1 GB:
sort: write failed: /tmp/sortmIGbL: No space left on device
因此,我正在寻找一种适合日常使用的有效替代方案:
awk
可以使用,但没有排序的关联数组
-
perl
似乎是一个不错的选择,但是来自 perlmonks.org 的 10 年前的解决方案 http://www.perlmonks.org/?node_id=249475似乎不起作用
no warnings;
$^W=0;
open my $in, $ARGV[0] or die "Couldn't open $ARGV[0]:$!";
my ($buffer, %h) = ''; keys %h = 1024*500;
while (sysread($in, $buffer, 16384, length $buffer)) {
$h{$1}++ while $buffer =~ m[^(?:.+?\|){9}([^|]+)\|]mg;
$buffer = substr($buffer, rindex($buffer, "\n"));
}
print scalar keys %h;
如何获得与以下相同的结果sort | uniq -c | sort -nr | head
对于非常大的文件?
- 当我使用 Linux/Cygwin/Solaris/*BSD/...时,我对任何想法持开放态度(可移植与否)
- 您可以自由使用您想要的脚本语言(
awk
/perl
/...)
输入示例
a
BB
ccccc
dddddddd
a
BB
a
可能的输出之一
3 a
2 BB
1 dddddddd
1 ccccc
首先sort
在你的命令链中是使用所有资源的那个。通过获得独特的线条来减少问题集first,然后排序:
perl -ne '
$count{$_}++;
END {
print "$count{$_} $_" for sort {
$count{$b} <=> $count{$a} || $b cmp $a
} keys %count
}
' input.txt
您有 66,000 个 7 字节的唯一行,因此散列键占用的内存将为每个标量的 66,000 * 56 字节 = 3,696,000 字节的键。这不包括计数和哈希的开销,但毫无疑问,这种方法很容易就能达到目的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)