Удалите строки, запускающиеся с “string1” и НЕ содержащие “string2” с sed

Я хотел бы удалить некоторые строки в файле с больше, чем 100K строками данных.

Я только хочу удалить строку, которая запустилась с MX и НЕ содержащий слово sum. Как я могу сделать это с sed?

Исходное содержание файла:

Original file content

Ожидаемое содержание файла:

Expected file content

1
задан 14 November 2019 в 11:26

1 ответ

На основе примеров обеспеченных в примерах статьи sed - 25 для удаления строки или шаблона в файле , мы можем составить эту команду:

sed '/^MX/{/sum/!d}' in-file            # just output the result
sed '/^MX/{/sum/!d}' in-file -i.bak     # change the file and create a backup copy
sed '/^MX/{/sum/!d}' in-file > out-file # create a new file with different name/path

Вот perl решение - источник :

perl -ne '/^MX((?!sum).)*$/ || print' in-file
perl -ne '/^MX((?!sum).)*$/ || print' in-file > out-file

то же регулярное выражение будет работать с grep -P (больше объяснения ). Но, вместо вышеупомянутой конструкции, которая буквально означает , если не затем печатают , для сохранения вывода подобранных строк с grep, нам нужно -v опция:

grep -vP '^MX((?!sum).)* 

Вот также awk решение:

awk  '! /^MX/ || /sum/ {print}' in-file
awk  '! /^MX/ || /sum/ {print}' in-file > out-file

относительно легко составить Ваши регулярные выражения сетевыми инструментами как [1 114] regextester.com .

сравнение Производительности:

$ du -sh in-file
2.4M    in-file
$ TIMEFORMAT=%R

$ time grep -vP '^MX((?!sum).)* in-file > out-file
0.049
$ time sed '/^MX/{/sum/!d}' in-file > out-file
0.087
$ time awk  '! /^MX/ || /sum/ {print}' in-file > out-file
0.090
$ time perl -ne '/^MX((?!sum).)*$/ || print' in-file > out-file
0.099
in-file grep -vP '^MX((?!sum).)*

Вот также awk решение:

awk  '! /^MX/ || /sum/ {print}' in-file
awk  '! /^MX/ || /sum/ {print}' in-file > out-file

относительно легко составить Ваши регулярные выражения сетевыми инструментами как [1 114] regextester.com .

сравнение Производительности:

$ du -sh in-file
2.4M    in-file
$ TIMEFORMAT=%R

$ time grep -vP '^MX((?!sum).)* in-file > out-file
0.049
$ time sed '/^MX/{/sum/!d}' in-file > out-file
0.087
$ time awk  '! /^MX/ || /sum/ {print}' in-file > out-file
0.090
$ time perl -ne '/^MX((?!sum).)*$/ || print' in-file > out-file
0.099
in-file > out-file

Вот также awk решение:

awk  '! /^MX/ || /sum/ {print}' in-file
awk  '! /^MX/ || /sum/ {print}' in-file > out-file

относительно легко составить Ваши регулярные выражения сетевыми инструментами как [1 114] regextester.com .

сравнение Производительности:

$ du -sh in-file
2.4M    in-file
$ TIMEFORMAT=%R

$ time grep -vP '^MX((?!sum).)* in-file > out-file
0.049
$ time sed '/^MX/{/sum/!d}' in-file > out-file
0.087
$ time awk  '! /^MX/ || /sum/ {print}' in-file > out-file
0.090
$ time perl -ne '/^MX((?!sum).)*$/ || print' in-file > out-file
0.099
2
ответ дан 7 December 2019 в 13:13

Другие вопросы по тегам:

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