#string #awk #sed #duplicates
#строка #awk #sed #дубликаты
Вопрос:
У меня есть текстовый файл, содержащий множество строк, в которых частично дублируются строки. Я хотел бы удалить строки, в которых совпадение строк встречается дважды, так что у меня останутся только строки с единственным совпадением (или вообще без совпадений).
Пример вывода:
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 и т.д. В примере выше).
Ответ №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
Ответ №2:
Следующая sed
команда выполнит то, что вы хотите.
sed -ne '/.* (.*)|.*1.*/!p' file.txt
Ответ №3:
grep: grep -vE '(sample[0-9]).*1' file
Ответ №4:
Вдохновляющий из ответа Гленна: используйте -i
с sed для непосредственного внесения изменений в файл.
sed -r '/(sample[0-9]).*1/d' txt_file