Файл:
Data inserted into table. Total count 13
No error occurred
Data inserted into table. Total count 45
No error occurred
Data inserted into table. Total count 14
No error occurred
Data inserted into table. Total count 90
No error occurred
Ожидаемый выходной файл:
Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90
Я хочу, чтобы вывод выглядел так: каждая вторая строка будет удалена, но между строками не будет пропуска.
text-processing
sed
awk
pmaipmui
источник
источник
grep -v "No error occurred" file
эта команда должна работать ... на что ответил @paul. В выходном файле не будет строк, содержащих «Нет ошибок».Ответы:
С
sed
:С POSIX
awk
:Если у вас есть старше
awk
(какoawk
), вам нужно:С
ex
:отредактируем файл на месте.
g
пометить глобальную команду/$/
соответствовать каждой линии+d
удалить следующую строкуwq!
сохранить все измененияЭтот подход разделяет тот же идеал с
sed
подходом, удаляя каждую следующую строку текущей строки, начиная со строки 1.С
perl
:и
perl6
:источник
n\;d
вместо того,'n;d'
чтобы сохранить драгоценный символ, но эта логика выходит за рамки, когда вы без необходимости используете-e
переключатель и перенаправление файлов<
!sed -e 'n;d'
, за исключением одного персонажа.n
команда записать пространство шаблона в стандартный вывод, если он-n
был использован, а затем заменить пространство шаблона следующей строкой. Здесь каждая нечетная строка будет напечатанаn
, четная строка затем будет считана в пространство шаблона, но немедленноd
удалена командой`.Решение этой проблемы путем удаления каждой второй строки может привести к ошибкам (например, когда процесс иногда генерирует две значащие строки вместо одной). Может быть, лучше отфильтровать мусор
Он может работать как фильтр, вы можете добавить больше шаблонов мусора и улучшить результат.
источник
В связи с вопросом, с GNU
sed
:удалит каждую вторую строку, но я бы хотел предложить строки фильтра по содержанию:
или с тем же результатом
источник
grep Data
иgrep -v 'No error'
Вот способ использования
sed
:Другой способ с GNU
sed
:Вывод вышеуказанных команд:
источник
shortest way using sed
?g
команде?sed -n 'p;n'
достаточно.g
. снял г с команды. :)Вы можете попробовать с
awk
:или вы можете печатать только строки, содержащие
Data inserted
:источник
Другой ответ, вы можете использовать vi / vim!
И тогда, если ваш файл был 500 строк (например) типа
А потом написать и выйти типа
Или, если что-то пойдет не так, и вы не хотите сохранять:
Объяснение:
источник
Вот совсем другой способ сделать это:
Это предполагает, что нечетные строки не содержат вкладок. Если они это сделают, то вам нужно будет выбрать другой символ разделителя, например,
:
здесь:источник
sed
с огромным файлом (например, 20 млн строк). В любом случае, +1, но на самом деле, чтобы избежать головной боли, выберите разделитель, который вряд ли встречается в текстовом файле, например$'\002'
...seq 100000000 > 100mil.txt
.paste|cut
Раствор закончил примерно 7,5 секунды, против почти 12 дляsed
раствора. Кажется, чтобы быть повторяемым.grep
самый быстрый, хотя Ubuntu 14.04 со стандартными инструментами GNU.paste
+cut
сильно оптимизированы для своей работы, поэтому неудивительно, что их комбинация чертовски быстра ...Другой вариант (короче)
источник
sed n\;d
, добавление-e
это только моя привычка.Это также решает проблему, хотя и немного медленнее:
источник