我有一个大文件(50 GB),我想计算其中不同行的出现次数。通常我会用
sort bigfile | uniq -c
但文件足够大,以至于排序需要大量的时间和内存。我能做到
grep -cfx 'one possible line'
对于文件中的每个唯一行,但这意味着n会为每个可能的行传递文件,这(虽然更多的内存友好)比原始行更长。
有什么想法吗?
related question询问在大文件中查找唯一行的方法,但我正在寻找一种计算实例数的方法每一个 - 我已经知道可能的线是什么。
答案 0 :(得分:8)
使用awk
awk '{c[$0]++} END {for (line in c) print c[line], line}' bigfile.txt
这是时间上的O(n),以及空间中的O(唯一线)。
答案 1 :(得分:3)
以下是使用jq 1.5的解决方案。它与方法和性能特征中的awk解决方案基本相同,但输出是表示哈希的JSON对象。 (该程序可以通过简单的修改,以另一种格式生成输出。)
调用:
+
如果bigfile.txt由以下行组成:
$ jq -nR 'reduce inputs as $line ({}; .[$line] += 1)' bigfile.txt
然后输出将是:
a
a
b
a
c
答案 2 :(得分:1)
#!/bin/bash
# port this logic to awk or ksh93 to make it fast
declare -A counts=( )
while IFS= read -r line; do
counts[$line]=$(( counts[$line] + 1 )) # increment counter
done
# print results
for key in "${!counts[@]}"; do
count=${counts[$key]}
echo "Found $count instances of $key"
done