проверить все строки в файле с помощью awk и grep и, если они совпадают, поместить их в другой файл

Почему бы не перейти в репозиторий Fedora git ? Например, ссылка на файл Firefox SPEC:

https://src.fedoraproject.org/cgit/rpms/firefox.git/plain/firefox.spec

0
12.04.2020, 13:04
1 ответ
awk -F '[|;]' '$3 == "french"' file >newfile

Это использует как |, так и ;в качестве разделителей полей и выполняет сравнение строк между третьим таким полем и строкой french. Если строка совпадает, выводится строка. Любой вывод перенаправляется в файл newfile.

Если использовать только|в качестве разделителя, вам придется проверить с регулярным выражением в начале третьего поля:

awk -F '|' '$3 ~ /^french;/' file >newfile

Это обнаруживает строку french;в начале третьего поля и выводит строку, если она совпадает.

Если frenchможет встречаться в любом месте третьего|-поля с разделителями (, например. как dutch;french), то вы можете немного ослабить этот шаблон при использовании

awk -F '|' '$3 ~ /french/' file >newfile

grepбыло бы немного неудобно использовать здесь, так как более сложно точно указать, какое поле с разделителями|-должно соответствовать в:

grep '^\([[:alpha:]]\{1,\}|\)\{2\}french;' file >newfile

Это соответствует строке алфавитных символов (букв ), за которыми следует символ |дважды, а затем строка french;.

С расширенным регулярным выражением:

grep -E '^([[:alpha:]]+\|){2}french;' file >newfile

Обратите внимание, что |теперь нужно экранировать, чтобы оно не интерпретировалось как чередование.

Опять же, если frenchможет встречаться в любом месте третьего поля, вам нужно будет немного смягчить выражение:

grep '^\([[:alpha:]]\{1,\}|\)\{2\}[^|]*french' file >newfile

или,

grep -E '^([[:alpha:]]+\|){2}[^|]*french' file >newfile

Я вставил [^|]*, который соответствует любой части не-|символов перед словом french(, например, строку dutch;), и я удалил ;в конце слово (или вы могли бы заменить ;на[;|]).

1
19.03.2021, 02:29

Теги

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