寻找uniq -c替代大文件

时间:2015-09-02 22:22:25

标签: bash shell uniq gnu-toolchain linux-toolchain

我有一个大文件(50 GB),我想计算其中不同行的出现次数。通常我会用

sort bigfile | uniq -c

但文件足够大,以至于排序需要大量的时间和内存。我能做到

grep -cfx 'one possible line'

对于文件中的每个唯一行,但这意味着n会为每个可能的行传递文件,这(虽然更多的内存友好)比原始行更长。

有什么想法吗?

related question询问在大文件中查找唯一行的方法,但我正在寻找一种计算实例数的方法每一个 - 我已经知道可能的线是什么。

3 个答案:

答案 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