Печать строк с нечетными номерами, печать строк с четными номерами

Я хочу напечатать строки из нечетных и четных строк из файлов.

Я нашел этот сценарий оболочки, который использует эхо.

#!/bin/bash # Write a shell script that, given a file name as the argument will write # the even numbered line to a file with name evenfile and odd numbered lines # in a text file called oddfile. # ------------------------------------------------------------------------- # Copyright (c) 2001 nixCraft project <http://cyberciti.biz/fb/> # This script is licensed under GNU GPL version 2.0 or above # ------------------------------------------------------------------------- # This script is part of nixCraft shell script collection (NSSC) # Visit http://bash.cyberciti.biz/ for more information. # ------------------------------------------------------------------------- file=$1 counter=0 eout="evenfile.$$" # even file name oout="oddfile.$$" # odd file name if [ $# -eq 0 ] then echo "$(basename $0) file" exit 1 fi if [ ! -f $file ] then echo "$file not a file" exit 2 fi while read line do # find out odd or even line number isEvenNo=$( expr $counter % 2 ) if [ $isEvenNo -ne 0 ] then # even match echo $line >> $eout else # odd match echo $line >> $oout fi # increase counter by 1 (( counter ++ )) done < $file echo "Even file - $eout" echo "Odd file - $oout" 

Но разве нет способа сделать это в одной строке?

Да, используйте awk, я читаю.

Строки с четными номерами:

 awk 'NR % 2' filename 

строки с нечетными номерами:

 awk 'NR % 2 == 1' filename 

Но это не работает для меня. Оба продукта производят одинаковый выход, согласно diff. По сравнению с исходным файлом они оба действительно наполовину длинны, и оба они содержат строки с нечетным номером. Я делаю что-то неправильно?

7 Solutions collect form web for “Печать строк с нечетными номерами, печать строк с четными номерами”

Когда вы спросили «в одной строке»:

 awk '{print>sprintf("%sfile.%d",NR%2?"odd":"even",PROCINFO["pid"])}' filename 

Обратите внимание, что большая часть кода связана с выбором вашего имени. В противном случае следующий код будет достаточным для размещения нечетных строк в строке «строка-1» и даже строк в строке «line-0»:

 awk '{print>"line-"NR%2}' filename 

Это легко:

  sed -n 2~2p filename 

будет печатать четные строки из имени файла

 sed -n 1~2p filename 

будет печатать строки с нечетными номерами.

Я предпочитаю быть совместимым с POSIX, когда это возможно, поэтому я решил опубликовать этот альтернативный метод. Я часто использую их для разглаживания текста, перед конвейерами xargs .

Печать даже нумерованных строк,

 sed -n 'n;p' 

Печать строк с нечетным номером,

 sed -n 'p;n' 

Хотя я часто использую awk , это слишком сложно для этого типа задач.

Для четных чисел код должен быть

 awk 'NR%2==0' filename 

& для нечетных чисел

 awk 'NR%2==1' filename 

Вы можете сделать это с помощью одного вызова sed , не нужно дважды читать файл:

 sed '$!n w even d' infile > odd 

или, если вы предпочитаете в одной строке:

 sed -e '$!n' -e 'w even' -ed infile > odd 

Обратите внимание, что это не даст ожидаемого результата, если файл содержит только одну строку (строка будет записана до четности вместо odd как первая n не будет выполнена). Чтобы этого избежать, добавьте условие:

 sed -e '$!n' -e '1!{w even' -e 'd}' infile > odd 

Попробуй это:

 awk '{if(NR%2){print $0 > "odd.file"}else{print $0 > "even.file"}}' filename 

Я бы пошел с perl потому что мне нравится perl :

 perl -pe 'BEGIN{open($e,">even_lines");open($o,">odd_lines")} $. % 2 ?select $o:select $e;' 

Использует тот факт, что -p неявно печатает, чтобы воспроизвести, как работает sed – и мы используем select для выбора дескриптора файла, которому он пишет.

  • Слияние дублированных строк, которые имеют одинаковые первые три поля
  • Как удалить несколько строк из файла с помощью оболочки
  • Печать между двумя шаблонами только в том случае, если первый шаблон появляется во второй раз
  • Как именно создать сценарий sed и использовать его для редактирования файла?
  • Как переформатировать блоки зоны named.conf в одну строку?
  • Фильтрация путей на определенную глубину
  • Как я могу «объединить» шаблоны в одной строке?
  • Как я могу отредактировать редактируемый результат?
  • sed для печати шаблона, который охватывает линии
  • Вырезание текста между двумя запятыми, исключая последующий текст
  • sed для совпадения нуля или большего количества пробелов в строке
  • Interesting Posts

    Что означает «неизвестный» пользователь в выводе команды «last»?

    Как уменьшить буфер записи Linux для съемных устройств?

    Копировать с помощью Find создает дубликаты файлов

    Перенаправить вывод в уже запущенную программу

    Каков источник «скомпилировать его самостоятельно» в linux

    Загрузочный загрузчик FreeBSD не загружается из правильного пула

    Ускорить / избежать вычисления списков файлов rsync

    Определите, является ли видеокарта новой

    ip правило не действует на fwmark

    Как переключить почтовые ящики в mutt?

    grep с количеством отдельных паттернов

    Переименование файлов для удаления строк в скобках

    Как выполнить grep -v -e ‘expr1’ и grep -e ‘expr2’ в одной команде?

    GNU Emacs; Предлагает ли версия графического интерфейса больше, чем возможность иметь меню графического интерфейса?

    connect () заблокирован в течение 3 секунд после успешного завершения соединения ()

    Linux и Unix - лучшая ОС в мире.