2015-10-19 63 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个字符复制到其他变量中。这会给你你的比较字符串。

执行完这些步骤后;比较应该是微不足道的。您可以将所有这些比较字符串存储在数组中并执行强力比较。数组的索引将是行号。每当你发现一个重复的,你会知道行号索引号的数组

相关问题