2013-10-31 47 views
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列中唯一字符串的總髮生次數 - 而我需要知道數字o f與第4列中發生的不同變量。

是否可以使用awk或grep來達到我想要的結果? 該文件相當大,大於100萬行,因此優化非常重要。

+0

這是這篇文章的一些重複:http://stackoverflow.com/questions/19705930/ print-lines-that-c​​ontain-a-value-in-a-specific-column-shared-by-more-1-enti/19706333#19706333 – Jotne

+0

不,它不是。相同的數據,不同的問題:) – owwoow14

回答

2

聽起來像你只是需要一個更具體的數組鍵。

awk 'NR==FNR {a[$2,$4]++; next} {print $0 "\t" a[$2,$4]}' file file 
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]] 
    } 
}