2012-02-21 195 views
119

我想從一個文本文件中刪除重複項,刪除重複項e.g:使用bash腳本

kavitha= Tue Feb 20 14:00 19 IST 2012 (duplicate entry) 
sree=Tue Jan 20 14:05 19 IST 2012 
divya = Tue Jan 20 14:20 19 IST 2012 
anusha=Tue Jan 20 14:45 19 IST 2012 
kavitha= Tue Feb 20 14:00 19 IST 2012 (duplicate entry) 

是否有任何可能的方式來刪除使用bash腳本重複的條目?

所需的輸出

kavitha= Tue Feb 20 14:00 19 IST 2012 
sree=Tue Jan 20 14:05 19 IST 2012 
divya = Tue Jan 20 14:20 19 IST 2012 
anusha=Tue Jan 20 14:45 19 IST 2012 
+17

*詢問如何刪除重複。問題被標記爲重複* – sysfiend 2017-01-12 12:28:55

+0

*這是一個關於刪除重複的問題。它被標記爲重複。* – 2018-02-24 12:29:55

回答

264

您可以sort然後uniq

$ sort -u input.txt 

或者使用awk

$ awk '!a[$0]++' input.txt 
+38

使用18,500行文本文件進行測試:「sort ...」大約需要0.57秒,而「awk ...」大約需要0.08s,因爲awk ...只是刪除了沒有重複的文件排序。 – Hugo 2013-10-19 12:38:07

+2

@Hugo我可以第二。測試2,626,198行'awk'擊敗'sort'。結果顯示'awk'需要5.675s和'sort'需要5.675s。有趣的是,相同的記錄集花費了15.1秒來執行MySQL DISTINCT查詢。 – 2016-02-11 19:13:17

+0

@TeganSnyder你寫的這兩個命令完全相同的時間執行。沒有'awk'花費更少的時間? – jarno 2016-05-17 09:59:42

7

它刪除重複的,連續的線條從A F ile(模擬「uniq」)。
保留一組重複行中的第一行,將其餘行刪除。

sed '$!N; /^\(.*\)\n\1$/!P; D' 
+0

進行排序,還有一個用於其他用途,如果要更改文件本身就是命令'sed -i'$!N; /^\(.*\)\n\1$/!P; D'' – 2015-10-21 06:43:43

0

這可能會爲你工作:

cat -n file.txt | 
sort -u -k2,7 | 
sort -n | 
sed 's/.*\t/ /;s/\([0-9]\{4\}\).*/\1/' 

或本:

awk '{line=substr($0,1,match($0,/[0-9][0-9][0-9][0-9]/)+3);sub(/^/," ",line);if(!dup[line]++)print line}' file.txt 
2

Perl的一個班輪類似@千電子伏的awk的解決方案:

perl -ne 'print if ! $a{$_}++' input 

這種變化在比較之前刪除末尾的空格:

perl -lne 's/\s*$//; print if ! $a{$_}++' input 

這種變化編輯就地文件:

perl -i -ne 'print if ! $a{$_}++' input 

這種變化快速修改的地方文件,使得備份input.bak

perl -i.bak -ne 'print if ! $a{$_}++' input