2013-02-23 169 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