2013-02-23 172 views
2

我正試圖在兩列數據列表中查找唯一且重複的數據。我真的只是想將數據列與1使用linux命令「sort -f | uniq -i」一起忽略大小寫

的數據可能是這樣的(由製表符分隔):

What are you doing?  Che cosa stai facendo? 
WHAT ARE YOU DOING?  Che diavolo stai facendo? 
what are you doing?  Qual è il tuo problema amico? 

所以我一直在玩弄如下:

  1. 而不忽略大小寫分選(只是 「排序」,沒有-f選項)給我少重複

    GAWK「{FS = 「\ t」 的;打印$ 1}'EN-IT_Corpus.txt | sort | uniq的-i -D>愚弄

  2. 與忽略大小寫( 「排序-f」)分揀給我更多的重複

    GAWK「{FS = 「\ t」 的;打印$ 1}'EN-IT_Corpus.txt | sort -f | uniq的-i -D>愚弄

難道我真的認爲#2是更準確的,如果我想找到重複忽略的情況下,因爲它排序它首先忽略大小寫,然後查找基於排序的數據複製?

據我所知,我不能合併排序和獨特的命令,因爲排序沒有顯示重複的選項。

謝謝你,史蒂夫

+1

的是從你的樣本數據你想要的輸出? – 2013-02-23 00:37:40

回答

4

我認爲關鍵是對數據進行預處理:

file="EN-IT_Corpus.txt" 
dups="dupes.$$" 
sed 's/  .*//' $file | sort -f | uniq -i -D > $dups 
fgrep -i -f $dups $file 

sed命令只產生了英語單詞;這些都是不區分大小寫的,然後通過uniq不區分大小寫,只打印重複的條目。然後再次處理數據文件,使用fgrepgrep -F查找那些重複鍵,指定要在文件-f $dups中查找的模式。顯然(我希望)sed命令中的大白色空格是一個製表符;您可以根據您的shell和sed等編寫\t等等。

事實上,GNU grep,你可以這樣做:

sed 's/  .*//' $file | 
sort -f | 
uniq -i -D | 
fgrep -i -f - $file 

如果重複的數量是非常大的,你可以擠下來有:

sed 's/  .*//' $file | 
sort -f | 
uniq -i -D | 
sort -f -u | 
fgrep -i -f - $file 

給定的輸入數據:

What a surprise?  Vous etes surpris? 
What are you doing?  Che cosa stai facendo? 
WHAT ARE YOU DOING?  Che diavolo stai facendo? 
Provacation   Provacatore 
what are you doing?  Qual è il tuo problema amico? 
Ambiguous  Ambiguere 

從所有這些輸出爲:

What are you doing?  Che cosa stai facendo? 
WHAT ARE YOU DOING?  Che diavolo stai facendo? 
what are you doing?  Qual è il tuo problema amico? 
2

或本:

獨特:

awk '!arr[tolower($1)]++' inputfile > unique.txt 

複製

awk '{arr[tolower($1)]++; next} 
END{for (i in arr {if(arr[i]>1){print i, "count:", arr[i]}} }' inputfile > dup.txt