我需要计算给定变量时特定列中的值出现的次数。
具体来说,我有一个3列制表符分隔文件,我有兴趣知道第4列中第2列中的字符串出现的不同变量的数量。
这是输入的一个例子:
waterline-n below-sheath-v 14.8097 A
dock-n below-sheath-v 14.5095 B
waterline-n below-steel-n 11.0330 A
picnic-n below-steel-n 12.2277 C
game-n below-steel-n 12.2277 D
dock-n below-steel-n 12.2277 D
wavefront-n at-part-of-variance-n 18.4888 L
wavefront-n between-part-of-variance-n 17.0656 A
audience-b between-part-of-variance-n 17.6346 B
game-n between-part-of-variance-n 14.9652 C
whereabouts-n become-rediscovery-n 11.3556 L
whereabouts-n get-tee-n 10.9091 L
这是所需输出的示例:
waterline-n below-sheath-v 14.8097 A 2
dock-n below-sheath-v 14.5095 B 2
waterline-n below-steel-n 11.0330 A 3
picnic-n below-steel-n 12.2277 C 3
game-n below-steel-n 12.2277 D 3
dock-n below-steel-n 12.2277 D 3
wavefront-n at-part-of-variance-n 18.4888 L 1
wavefront-n between-part-of-variance-n 17.0656 A 2
audience-b between-part-of-variance-n 17.6346 B 2
game-n between-part-of-variance-n 14.9652 C 1
whereabouts-n become-rediscovery-n 11.3556 L 1
whereabouts-n get-tee-n 10.9091 L 1
我尝试过以下awk:
awk 'NR==FNR{a[$2]++;next}{print $0 "\t" a[$2]}' file file
但是它计算了第2列中唯一字符串出现的次数 - 而我需要知道第4列中出现的不同变量的数量。
是否可以使用awk或grep来达到我想要的效果? 该文件非常大> 1百万行,因此优化很重要。
答案 0 :(得分:2)
听起来你只需要一个更具体的数组键。
awk 'NR==FNR {a[$2,$4]++; next} {print $0 "\t" a[$2,$4]}' file file
答案 1 :(得分:1)
您可以尝试以下方法:
awk -f count.awk input.txt
其中count.awk
是:
{
line[NR]=$0
if (! ($2,$4) in a) {
a[$2,$4]++
aa[$2]++
}
b[NR]=$2
}
END {
for (i=1; i<=NR; i++) {
print line[i], aa[b[i]]
}
}