Я хотел бы удалить некоторые строки в файле с больше, чем 100K строками данных.
Я только хочу удалить строку, которая запустилась с MX
и НЕ содержащий слово sum
. Как я могу сделать это с sed
?
Исходное содержание файла:
Ожидаемое содержание файла:
На основе примеров обеспеченных в примерах статьи 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