我有一个包含多个列的文件,但我想删除第一列中最后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
谢谢
答案 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个字符复制到其他变量。这将为您提供比较字符串。
执行这些步骤后;比较应该是微不足道的。您可以将所有这些比较字符串存储在数组中并执行强力比较。数组的索引将是行号。每当您找到重复时,您将通过数组的索引号
知道行号