2015-10-19 40 views
0

我有一個包含多列的文件,但我想刪除第一列中最後8個字符的重複項。下面有一個例子:如何根據特定列中的最後幾個字符刪除重複項?

AJCBK:1:1106:16747:8632_1:N:0:AGCTTCAGTTGTGTGG + Gene 0 Sequence Score 0 
AJCBK:1:1109:14645:19987_1:N:0:AGCTTCAGTTGTGTGG + Gene 0 Sequence Score 0 
AJCBK:1:1111:14232:8175_1:N:0:AGCTTCAGCTGCCCTT + Gene 0 Sequence Score 0 
AJCBK:1:2101:5753:25007_1:N:0:AGCTTCAGCTGCCCTT + Gene 0 Sequence Score 0 
AJCBK:1:2101:8971:7239_1:N:0:AGCTTCAGGGTATGGC + Gene 0 Sequence Score 0 
AJCBK:1:2102:15618:28054_1:N:0:AGATTCAGTTGTGTGG + Gene 0 Sequence Score 0 
AJCBK:1:2106:15389:25632_1:N:0:AGCTTCAGTTGTATCT + Gene 0 Sequence Score 0 
AJCBK:1:2113:17273:8419_1:N:0:AGCTTCAGCTGCCCTT + Gene 0 Sequence Score 0 

正如你看到的每一行是基於前23個字符的不同,所以我不能用自己的第一列運行uniq的。我想刪除基於最後8個字符的所有重複因此它看起來就像這樣:

AJCBK:1:1106:16747:8632_1:N:0:AGCTTCAGTTGTGTGG + Gene 0 Sequence Score 0 
AJCBK:1:1111:14232:8175_1:N:0:AGCTTCAGCTGCCCTT + Gene 0 Sequence Score 0 
AJCBK:1:2101:8971:7239_1:N:0:AGCTTCAGGGTATGGC + Gene 0 Sequence Score 0 
AJCBK:1:2106:15389:25632_1:N:0:AGCTTCAGTTGTATCT + Gene 0 Sequence Score 0 

感謝

回答

1

......怎麼

gawk "{x=substr($1,length($1)-8,8); if (!seen[x]) {print $0}; seen[x]++}" data.txt 

它需要的最後8個字符字段1分成x,跟蹤seen中的模式,如果是新模式,它將打印整行,否則不打印任何內容。

+0

這真的很整齊。我不知道存在這樣的事情。謝謝 – Sharad

0

逐行讀取文件,然後根據空間拆分它。採取分裂的第一個元素。這將是第一列的元素。現在取第一個元素的最後8個字符。在Python語言中,它將如此簡單:

last_eight = complete[-8::1] 

在C中,如果您想獲得相同的結果;那麼你將不得不使用strtok來標記;然後取出令牌的長度並將最後8個字符複製到其他變量中。這會給你你的比較字符串。

執行完這些步驟後;比較應該是微不足道的。您可以將所有這些比較字符串存儲在數組中並執行強力比較。數組的索引將是行號。每當你發現一個重複的,你會知道行號索引號的數組

相關問題