2014-01-29 23 views
0

我想在文本文件中找到第一行重複的行。查找文件中的第一條重複行

我經常查找文件中重複行的方法是使用uniq的,這需要一個排序的文件,所以我:

sort inputfile | uniq -c | sort -nr > outputfile 

計算所有的副本和按遞減順序打印。

通過排序,然後使用uniq,我失去了原始的重複發生時/在哪裏,而現在我只關心哪一行是第一個重複。

任何想法?

+0

提示:'cat -n'。 –

回答

5
awk '{ if(seen[$0]) { print; exit } seen[$0] = 1 }' file 

這將跟蹤每一行,然後打印出它以前看到的第一行。如果您想要行號,請打印NR。

awk '{ if(seen[$0]) { print NR, $0; exit } seen[$0] = 1 }' file 
+1

你可以打高爾夫球:'awk's [$ 0] ++ {print; exit}'file' - 使用後增量,所以這是一條線的第一次重複。 –

+0

我不認爲這是正確的:'cat -n f | sort -k2 -k1,1 | uniq -df1'返回*第一行*號,*有*重複,而不是第二次被看到。你甚至不能'sort -k2 -k1,1r',因爲如果有超過2倍的行出現,它會給你*最後*行號。 –

0

因爲我知道Perl中,我傾向於使用它的俏皮話:

perl -e 'foreach (<>) { $n++; if ($l{$_}++) { print "$n\n"; last; } }' < infile 

這打印到stdout第一個重複的行號。

+1

或更短:'perl -ne'die $ _ if $ seen {$ _}; $見過{$ _} ++'infile' – grebneke

+0

不錯,除了不顯示行號和'die'寫入STDERR。 – paddy

+0

是的。甚至更短,包括行號和STDOUT:'perl -ne'死「$。$ _」if $ seen {$ _} ++'infile 2>&1' – grebneke