Я хочу напечатать строки с нечетными и четными номерами из файлов.
Я нашел этот сценарий оболочки, который использует эхо.
#!/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. По сравнению с исходным файлом они действительно вдвое длиннее и содержат строки с нечетными номерами. Я делаю что-то неправильно?
text-processing
sed
awk
ixtmixilix
источник
источник
NR % 2 == 0
, в противном случае он эквивалентен второму.Ответы:
Как вы спросили «в одну строку»:
Обратите внимание, что большая часть кода связана с вашим необычным выбором имени выходного файла. В противном случае следующего кода было бы достаточно, чтобы поместить нечетные строки в «line-1» и четные строки в «line-0»:
источник
Я предпочитаю быть POSIX-совместимым, когда это возможно, поэтому я решил опубликовать этот альтернативный метод. Я часто использую их для искажения текста перед
xargs
конвейерами.Печать четных линий,
Печать нечетных линий,
Хотя я часто использую
awk
, это слишком много для такого рода задач.источник
Это легко:
будет печатать четные строки из имени файла
напечатает нечетные строки.
источник
awk
, лично я использую его очень часто. Я никогда не говорил, что что-то было «не POSIX»awk
, я имел в видуsed
варианты ответа . В частности,~
оператор, это расширение GNU, которое все еще приемлемо для многих людей. Относительно «использовать AWK посторонним образом, I personally believe using
awk» для этой простой задачи - это излишне. Таким образом, +1 был для выполнения задачи сsed
более легкой утилитой, чемawk
.Для четных чисел код должен быть
& для нечетных чисел
источник
gawk 'FS=",";NF%2==0' file.csv
.Вы можете сделать это одним
sed
вызовом, не нужно читать файл дважды:или, если вы предпочитаете в одну строку:
Обратите внимание, что они не дадут ожидаемого результата, если файл содержит только одну строку (строка будет
w
записанаeven
вместо того,odd
чтобыn
не выполнить первую ). Чтобы избежать этого, добавьте условие:Как это устроено ? Хорошо, он использует три
sed
команды:n
- если не в последней строке, выведите пространство шаблона вstdout
(которое перенаправлено в файлodd
), замените его следующей строкой (так что теперь он обрабатывает четную строку) и продолжите выполнение оставшихся командw
- добавьте пространство шаблона в файлeven
d
- удалите текущее пространство шаблона и перезапустите цикл - побочный эффект этого состоит в том,sed
что никогда не будет автоматически печатать пространство шаблона, поскольку оно никогда не достигнет конца сценарияДругими словами,
n
выполняется только на нечетных строках иw
иd
выполняется только на четных строках.sed
никогда не попадает в автопечать, если, как я уже сказал, ввод не состоит из одной строки.источник
Попробуй это:
источник
Я бы пошел с,
perl
потому что мне нравитсяperl
:Использует тот факт, что
-p
неявно печатает, чтобы реплицировать, какsed
работает - и мы используем,select
чтобы выбрать дескриптор файла, в который он пишет.источник