基于搜索从文件和总和列输入grep

时间:2016-02-05 22:50:05

标签: linux bash awk grep

我使用grep从文件输入搜索字符串,使用awk根据搜索结果打印出列的总和

grep -f input data.txt |awk '{ sum+=$2} END {print sum}'

这给了我所有输入字符串的总和。如何单独获取每个输入字符串的总和?

示例input

a  
b  
c

示例data.txt

a/cell1 5  
b/cell1 5  
a/cell2 8  
c/cell1 10

输入中没有行~32 data.txt的大小 - 5GB

预期结果:

a 13  
b 5  
c 5

4 个答案:

答案 0 :(得分:2)

$ awk 'NR==FNR{sum[$0]=0;next} $1 in sum{sum[$1]+=$2} END{for (key in sum) print key, sum[key]}' input data.txt
a 2
b 1
c 1

答案 1 :(得分:0)

很难说没有看到你的文件,但可能:

grep -f input data.txt | \
awk '{sum[$1] += $2} END { for (key in sum) { print key, sum[key] } }'

答案 2 :(得分:0)

这个5GB文件的运行速度是否足够快?

awk 'NR == FNR {sum[$1]+=$2} NR != FNR {printf "%s %s\n", $1, sum[$1] }' file1 file2

其中 file1 是5GB文件, file2 是包含您要在 file1 中找到的字符串的文件。

修改 正如@EdMorton先前评论的那样,当找不到sum[$1]时,我的解决方案将为$1打印空白。 此外,@ EdMorton提供的答案将打印 0 。 我建议首先查看他的答案,因为它被认为可以更好地满足您的需求。

答案 3 :(得分:0)

以下内容可避免累积不必要的细节,因此可能会避免内存分配错误。它假定感兴趣的字符串列表位于名为input的文件中:

awk -v dict=input '
  BEGIN {while((getline<dict) > 0) {a[$1]=1}}
  a[$1] {sum[$1] += $2}
  END { for (key in sum) { print key, sum[key] } }'

如果这不能解决内存问题,请详细说明您的awk,操作系统以及其他可能相关的内容。