计算与其他列中的变量对应的特定列

时间:2013-10-31 15:58:43

标签: awk terminal grep

我需要计算给定变量时特定列中的值出现的次数。

具体来说,我有一个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百万行,因此优化很重要。

2 个答案:

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