sed-仅当行包含字符串的多个实例时才删除

时间:2019-03-18 19:32:23

标签: string awk sed duplicates

我有一个文本文件,其中包含许多行,这些行的字符串部分重复。我想删除出现两次字符串匹配的行,这样我只剩下一个匹配(或根本不匹配)的行。

示例输出:

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行重复了两次,第5行在第3行重复了两次。因为它只包含每个样本的一个实例。

我可以使用不同的“匹配”字符串(例如上例中的sample1_out,sample2_out等)多次重复此操作。

4 个答案:

答案 0 :(得分:1)

这里是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

答案 1 :(得分:0)

以下sed命令将完成您想要的操作。

sed -ne '/.* \(.*\)|.*\1.*/!p' file.txt

答案 2 :(得分:0)

grep:grep -vE '(sample[0-9]).*\1' file

答案 3 :(得分:0)

从格伦的答案中得到启发:将Shift shift = (Shift)comboBoxShift.SelectedItem; 与sed一起使用可直接在文件中进行更改。

-i