如何根据特定列中的最后几个字符删除重复项?

时间:2015-10-19 17:17:41

标签: sorting uniq

我有一个包含多个列的文件,但我想删除第一列中最后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

谢谢

2 个答案:

答案 0 :(得分:1)

怎么样......

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

将字段1的最后8个字符转换为x,跟踪seen中的模式,如果是新模式,则会打印整行,否则不打印任何内容。

答案 1 :(得分:0)

逐行读取文件,然后根据空间拆分。采取分裂的第一个元素。这将是第一列的元素。现在取第一个元素的最后8个字符。在类似python的语言中,它将如下所示:

last_eight = complete[-8::1]

如果你想获得相同的结果,在C中;那么你将不得不使用strtok来标记;然后获取令牌的长度并将最后8个字符复制到其他变量。这将为您提供比较字符串。

执行这些步骤后;比较应该是微不足道的。您可以将所有这些比较字符串存储在数组中并执行强力比较。数组的索引将是行号。每当您找到重复时,您将通过数组的索引号

知道行号