Удалить повторяющиеся строки, содержащие определенный текст

Все эти функции работают с определенной строкой, которую вы передаете функции, или, в случае gensub(), gsub()и sub(), с $0(, т.е. полной входной записью ), если вы не предоставляете строку. Они не будут разбивать данную строку на поля или использовать FSили OFS.

Итак, да, ни на одну из этих функций не влияет изменение FSили OFS. Они рассматривают данную строку как есть. Если в качестве входной строки используется $0, вся эта строка используется без изменений.

Это не мешает вам использовать, например,. gsub()на отдельном поле, очевидно.

1
13.01.2021, 08:14
3 ответа

Одним из простых способов может быть:

awk '!/Word/ || !a[/Word/]++' file

awk 'm=!/Word/ || !a[!m]++'

, что переводится как :печатать все строки, не содержащие Word ИЛИ, если они есть, затем печатать только первую строку, содержащую его, и запрещать остальные.

Обратите внимание, :вам может понадобиться подтянуть то, что есть Слово, которое я оставляю вам в качестве упражнения.

3
18.03.2021, 22:37

Вы можете попробовать это:

sed '0,/Word/b;/Word/d' file

Удалить строки, соответствующие «Word»:

/Word/d 

От начала файла до первой строки, соответствующей «Word», перейти к концу скрипта --, то есть пропустить команду удаления:

0,/Word/b

Из этого поста stackoverflow .

1
18.03.2021, 22:37

Если вы хотите выполнить частичное сравнение регулярных выражений (, см.https://stackoverflow.com/questions/65621325/how-do-i-find-the-text-that-matches-a-pattern):

$ awk -v regexp='Word' '!(($0 ~ regexp) && seen[$0]++)' file
Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5

или если вы хотите частичное сравнение строк:

$ awk -v string='Word' '!(index($0,string) && seen[$0]++)' file
Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5

Если вам нужно другое соответствие, отредактируйте свой вопрос, чтобы внести ясность.

2
18.03.2021, 22:37

Теги

Похожие вопросы