2012-10-18 21 views
2

我有一個製表符分隔的文件,我想刪除僅在前三列中相同的行(保留一個副本)。我更喜歡使用unix來做到這一點,例如awk或uniq。當三列完全相同時刪除行

輸入文件:

Supercontig_1.1 241783 286397 5677 52 
Supercontig_1.1 241783 286397 5678 53 
Supercontig_1.1 241783 286397 5679 53 
Supercontig_1.2 10500 25700 3000 57 
Supercontig_1.2 10500 25700 3001 59 
Supercontig_1.2 10500 25700 3002 59 
Supercontig_1.3 2000 7000 5686 60 
Supercontig_1.3 2000 7000 5687 60 

輸出:

Supercontig_1.1 241783 286397 5677 52 
Supercontig_1.2 10500 25700 3000 57 
Supercontig_1.3 2000 7000 5686 60 

回答

5

一種使用awk方式:

awk '!array[$1,$2,$3]++' file.txt 

結果:

Supercontig_1.1 241783 286397 5677 52 
Supercontig_1.2 10500 25700 3000 57 
Supercontig_1.3 2000 7000 5686 60 
+0

作品。非常感謝! – Jon

+0

小心 - 如果例如第一行包含「1 23 4」並且第二行包含「1 2 34」,因爲它們都映射到「1234」,那麼連接這樣的字段將會產生錯誤的輸出。您需要爲此使用僞多維數組:!a [$ 1,$ 2,$ 3] ++。 –

+0

謝謝@EdMorton! - 小監督。我想我經常使用'FS',但即使這樣也會有問題。我做了一些測試,逗號實際上設置了空分隔符:'\ 0'。有趣。 – Steve

2

這oneliner做的伎倆:

awk '!a[$1$2$3]++' file 

測試

kent$ echo "Supercontig_1.1 241783 286397 5677 52 
dquote> Supercontig_1.1 241783 286397 5678 53 
dquote> Supercontig_1.1 241783 286397 5679 53 
dquote> Supercontig_1.2 10500 25700 3000 57 
dquote> Supercontig_1.2 10500 25700 3001 59 
dquote> Supercontig_1.2 10500 25700 3002 59 
dquote> Supercontig_1.3 2000 7000 5686 60 
dquote> Supercontig_1.3 2000 7000 5687 60 
dquote> "|awk '!a[$1$2$3]++' 
Supercontig_1.1 241783 286397 5677 52 
Supercontig_1.2 10500 25700 3000 57 
Supercontig_1.3 2000 7000 5686 60