sed - удаляет строки, только если они содержат несколько экземпляров строки - PullRequest
0 голосов
/ 18 марта 2019

У меня есть текстовый файл, который содержит многочисленные строки с частично дублированными строками. Я хотел бы удалить строки, в которых совпадение строк происходит дважды, так что у меня остаются только строки с одним совпадением (или вообще без совпадения).

Пример вывода:

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, sample 2 дважды в строке 2, а sample 5 повторяется дважды в строке 3. Строка 4 будет проходить потому что он содержит только один экземпляр каждого образца.

Хорошо, я повторяю эту операцию несколько раз, используя разные строки 'match' (например, sample1_out, sample2_out и т. Д. В примере выше).

Ответы [ 4 ]

1 голос
/ 18 марта 2019

Вот один в 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
0 голосов
/ 18 марта 2019

Вдохновленный ответом Гленна: используйте -i с sed для непосредственного внесения изменений в файл.

sed -r '/(sample[0-9]).*\1/d' txt_file
0 голосов
/ 18 марта 2019

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

0 голосов
/ 18 марта 2019

Следующая команда sed выполнит то, что вы хотите.

sed -ne '/.* \(.*\)|.*\1.*/!p' file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...