我有一个文本文件,其中包含许多具有部分重复字符串的行。我想删除字符串匹配发生两次的行,这样我只剩下一行匹配(或根本没有匹配)。
示例输出:
g1: sample1_out|g2039.t1.faa sample1_out|g334.t1.faa sample1_out|g5678.t1.faa sample2_out|g361.t1.faa sample3_out|g1380.t1.faa sample4_out|g597.t1.faa
g2: sample1_out|g2134.t1.faa sample2_out|g1940.t1.faa sample2_out|g45.t1.faa sample4_out|g1246.t1.faa sample3_out|g2594.t1.faa
g3: sample1_out|g2198.t1.faa sample5_out|g1035.t1.faa sample3_out|g1504.t1.faa sample5_out|g441.t1.faa
g4: sample1_out|g2357.t1.faa sample2_out|g686.t1.faa sample3_out|g1251.t1.faa sample4_out|g2021.t1.faa
在这种情况下,我想删除第1,2和3行,因为sample1在第1行重复多次,第2行在第2行重复两次,第3行在第3行重复两次。第4行将通过,因为它包含每个样本只有一个实例。
我可以使用不同的“匹配”字符串多次重复此操作(例如上面示例中的sample1_out,sample2_out等)。
这是GNU awk中的一个:
$ awk -F"[| ]" '{ # pipe or space is the field reparator
delete a # delete previous hash
for(i=2;i<=NF;i+=2) # iterate every other field, ie right side of space
if($i in a) # if it has been seen already
next # skit this record
else # well, else
a[$i] # hash this entry
print # output if you make it this far
}' file
输出:
g4: sample1_out|g2357.t1.faa sample2_out|g686.t1.faa sample3_out|g1251.t1.faa sample4_out|g2021.t1.faa
以下sed
命令将完成您想要的任务。
sed -ne '/.* \(.*\)|.*\1.*/!p' file.txt
抓地力:grep -vE '(sample[0-9]).*\1' file
灵感来自Glenn的答案:使用-i
和sed直接对文件进行更改。
sed -r '/(sample[0-9]).*\1/d' txt_file