2013-07-29 27 views
4

我有一個文件包含發現在一個領域的重複和UNIX的bash打印它們

apple 
apple 
banana 
orange 
apple 
orange 

我想要找到的重複蘋果和橙告訴以下用戶的腳本:蘋果和桔子是重複。 我試圖

nawk '!x[$1]++' FS="," filename 

找到重複項 所以我怎樣才能在UNIX bash中打印出來?

回答

1

更新:

問題已被顯着改變。以前,回答這個時候,輸入文件應該是這樣的:

apple apple banana orange apple orange 
banana orange apple 
... 

然而,該解決方案將反正工作,但可能是有點太複雜了這個特殊的使用情況。


以下awk腳本將做的工作:

awk '{i=1;while(i <= NF){a[$(i++)]++}}END{for(i in a){if(a[i]>1){print i,a[i]}}}' your.file 

輸出:

apple 3 
orange 2 

正是在這樣的形式更容易理解:

#!/usr/bin/awk 

{ 
    i=1; 
    # iterate through every field 
    while(i <= NF) { 
    a[$(i++)]++; # count occurrences of every field 
    } 
} 

# after all input lines have been read ... 
END { 
    for(i in a) { 
    # ... print those fields which occurred more than 1 time 
    if(a[i] > 1) { 
     print i,a[i]; 
    } 
    } 
} 

然後使文件可執行並執行它傳遞荷蘭國際集團輸入文件名給它:

chmod +x script.awk 
./script.awk your.file 
+0

+1。試圖格式化問題時,很明顯輸入文件的項目放在不同的行上。我同意這很難猜測。 – devnull

+0

@devnull :)我猜這樣的東西..但是,現在我們有兩個解決方案,兩個稍微不同的用例。因此,這不是很糟糕..... – hek2mgl

+0

如果有2個字段呢?它如何知道它應該搜索哪個文件? – t28292

10

爲了打印重複行,你可以說:

$ sort filename | uniq -d 
apple 
orange 

如果你要打印的數量爲好,供應-c選項uniq

$ sort filename | uniq -dc 
     3 apple 
     2 orange 
+0

+1在這種情況下肯定比'awk'更好;) – hek2mgl

+0

請注意,根據uniq,單詞「ウェイター」是「ウエイター」(ェ=エ) – asdjfiasd

4

+1 devnul's answer。但是,如果該文件包含空格而不是換行符作爲分隔符。那麼以下將起作用。

tr [:blank:] "\n" < filename | sort | uniq -d 
相關問題