0

在给定变量的情况下,我需要计算特定列中的值出现的次数。

具体来说,我有一个 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 来达到我想要的结果?该文件非常大 > 100 万行,因此优化很重要。

4

2 回答 2

3

听起来你只需要一个更具体的数组键。

awk 'NR==FNR {a[$2,$4]++; next} {print $0 "\t" a[$2,$4]}' file file
于 2013-10-31T17:02:26.857 回答
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]]
    }
}
于 2013-10-31T17:17:32.797 回答