Удалите нечетные или четные строки из текстового файла
Мне нужно удалить нечетные строки в текстовом файле, чтобы сделать выборку вниз. Я нашел эту команду,
awk 'NR%2==0' file
но он печатает только нечетные строки в терминале. Как их удалить?
Мне действительно не нужны четкие или нечетные, я хочу, чтобы они удалялись из файла или печатались в другом файле. Это только печатает их в терминале.
Ответы
Ответ 1
AWK
%
является оператором модуля, а NR
- текущим номером строки, поэтому NR%2==0
является истинным только для четных строк и будет вызывать для них правило по умолчанию ({ print $0 }
). Таким образом, чтобы сохранить только четные линии, перенаправьте вывод из awk
в новый файл:
awk 'NR%2==0' infile > outfile
СЕПГ
Вы можете сделать то же самое с sed
. Ответ devnulls показывает, как это сделать с помощью GNU sed
.
Ниже приведены альтернативы для версий sed
, у которых нет оператора ~
:
сохранить нечетные строки
sed 'n; d' infile > outfile
сохранить четные строки
sed '1d; n; d' infile > outfile
Ответ 2
Использование команды GNU:
sed -i '0~2d' filename
чтобы удалить четные пронумерованные строки из файла.
Для удаления нечетных строк:
sed -i '1~2d' filename
Параметр -i
приведет к тому, что изменения будут сохранены в файле на месте.
Цитата из руководства:
`FIRST~STEP'
This GNU extension matches every STEPth line starting with line
FIRST. In particular, lines will be selected when there exists a
non-negative N such that the current line-number equals FIRST + (N
* STEP). Thus, to select the odd-numbered lines, one would use
`1~2'; to pick every third line starting with the second, `2~3'
would be used; to pick every fifth line starting with the tenth,
use `10~5'; and `50~0' is just an obscure way of saying `50'.
Ответ 3
Не сосредотачивайтесь на отрицательном (удаление линий), фокусируйтесь на положительном (выбираете линии), и ваше решение последует этому примеру. Поэтому вместо I need to remove odd lines
вы должны думать I need to select even lines
, а затем решение просто:
awk '!(NR%2)' file
Если вы хотите сохранить результат в новый файл:
awk '!(NR%2)' file > newfile
или обратно к оригиналу:
awk '!(NR%2)' file > newfile && mv newfile file
Ответ 4
Здесь пример awk
для создания двух новых файлов, содержащих нечетные и четные строки, соответственно:
awk '{ if (NR%2) print > "odd.txt"; else print > "even.txt" }' input.txt
Ответ 5
Решение Perl для печати в новом файле:
perl -lne 'print if $. % 2 == 0' infile > outfile
Чтобы напечатать коэффициенты, измените == 1
на == 0
$.
- номер строки
Сохраняется только в исходном файле:
perl -i -lne 'print if $. % 2 == 0' infile
То же, что и выше, но создает резервный файл с именем infile.bak:
perl -i.bak -lne 'print if $. % 2 == 0' infile
Ответ 6
Это может работать для вас (GNU sed):
sed -n 'p;n' file # keep odd
sed -n 'n;p' file # keep even