2014-10-08 36 views
1

我想查看我的列2中的哪個字符串重複。檢查某列中的哪個字符串重複

例如:

a apple 
b peach 
c grape 
d peach 
e peach 
f apple 

我的輸出將是:

a apple 
f apple 
b peach 
d peach 
e peach 

顯示具有上第二列的子串的整行。

回答

3

如果您不想將所有文件存儲在內存中,最好的辦法是兩次讀取文件。

$ awk 'FNR==NR {a[$2]++; next} a[$2]>1' file file 
a apple 
b peach 
d peach 
e peach 
f apple 
  • 首先計數列值出現多少次
  • 其次要打印在其中第二列進行計數的至少兩倍的行。

作爲Jonathan Leffler suggests,重現您得到精確的輸出,只是管sort指示它應該排序首先通過柱2,然後通過柱1:

awk 'FNR==NR {a[$2]++; next} a[$2]>1' file file | sort -k2,2 -k1 
+1

+1雖然我們之間吹毛求疵可能會注意到,原來的輸出具有鄰近列出輸出對方所有的蘋果,和所有的桃子了。通過在第二列對腳本的輸出進行排序,可能會最容易解決這個問題:'| sort -k2'或者可能是'| sort -k2,2 -k1'。如果這些文件足夠小以適應內存,那麼它也可以在'awk'中完成,如果它們不足夠,則更容易。 – 2014-10-08 14:58:52

+0

@JonathanLeffler非常真實。我剛剛更新了您的「排序」建議。我傾向於喜歡用管道工具來處理最好的東西,所以在這種情況下,我認爲用'|來排序是一個完美的選擇排序:) – fedorqui 2014-10-08 15:08:30

0

即沒有按」 A perl的溶液T上讀兩次文件:

perl -lane 'push @{$s{$F[1]}},$_; 
      END{ 
       do{print join "\n", @{$s{$_}} if scalar(@{$s{$_}})>1}for(%s) 
      }' file 

這又通過文件,並保持各行中的哈希,其關鍵是2ST場和衛生組織e值是行列表。然後,最後,它將打印出鍵不止一次出現的列表。

0

隨着GNU AWK真正的二維數組:

gawk ' 
{ vals[$2][++cnt[$2]] = $0 } 
END { 
    for (fruit in vals) 
     if (cnt[fruit] > 1) 
      for (i=1; i<=cnt[fruit]; i++) 
       print vals[fruit][i] 
} 
' file 
a apple 
f apple 
b peach 
d peach 
e peach 
相關問題