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

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

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

#!/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 для выбора дескриптора файла, которому он пишет.

  • Перемещение файлов в отдельные каталоги на основе группировки, определенной в файле CSV
  • удалить строки в файле csv старше 7 дней
  • Использование sed для скобок
  • Учебный материал Sed and Awk
  • Соответствие строки EXACT в файле и обновлении IP-адреса
  • Некоторые символы UTF-8, которые не распознаются grep или sed
  • Как заменить слово новой строкой
  • Как я могу сортировать файл .txt по двум столбцам?
  • Поиск конкретных слов и удаление всех строк после него
  • Создание сетевых конфигурационных файлов с помощью sed и bash
  • Хотите, чтобы rsync некоторые файлы после того, как они были sedded
  • Linux и Unix - лучшая ОС в мире.