我使用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
答案 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,操作系统以及其他可能相关的内容。