Как я реализую каретку или возврат новой строки в каждой команде awk в сценарии оболочки, таком, что вывод каждой команды разделяется от следующего?
Возможно, мне нужно больше спецификации. У меня есть две команды awk, упомянутые ниже:
awk {print $1, $2}
, команда 1 awk, выводы:
John Bender
Bohn Jender
Jen Bondher
awk '{print $3, $4}'
, команда 2, выводы:
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
При объединении в сценарии оболочки и выполнении с ./<testscript>.sh <textfile>
, командная строка, очевидно, выводы:
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
Поскольку я хочу новую строку, добавляют PER awk команда, я хочу, чтобы вывод посмотрел просто как:
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
Предыдущие попытки добавления "\n" привели к:
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
.. который, конечно, нежелателен.
Когда Вы работаете из сценария оболочки, просто добавьте echo
после каждого awk
команда т.е. промежуточный команды, Вы хотите получить отдельные выводы. echo
добавляет новую строку. Например:
awk '{print $1 $2}' file.txt
echo
awk '{print $3, $4}' file.txt
<час> Исходный ответ:
Добавляют printf "\n"
в конце каждого awk
действие {}
.
printf "\n"
распечатает новую строку.
Пример:
% awk '{print $1; printf "\n"}' <<< <час>foo bar\nspam egg'
foo
spam
<час> Просто, потому что возможно сделать так, вот то, какие альтернативные подходы могут быть проявлены.
Этот подход пробегает файл дважды, и во время пробежки во второй раз файла, когда это печатает новую строку, которая достигается через использование нескольких интересных идей.
Для обработки того же файла, но извлечения другой информации, файл дан на командной строке дважды.
, Как мы различаем, когда мы пробегаем первый файл (для извлечения полей 1$ и 2$) и когда через второй? Через использование ARGIND
переменная.
NR
общая запись, обработанная до сих пор, и FNR
общая запись, обработанная в текущем файле. С первым файлом они - то же. Когда они будут отличаться? Когда мы добираемся до второго файла. В данный момент мы должны распечатать новую строку, но так или иначе предотвратить то, чтобы она была распечатанным для других значений где NR > FNR
. Мы повышаем флаг (через переменную флага).
Демонстрационный вывод:
$ awk '!flag && NR>FNR {print "";flag=1} ARGIND==1{print $1,$2}ARGIND==2{print $3,$4}' data.txt data.txt
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
КОНЦА, Как упомянуто в комментариях в соответствии с ответом heemayls, при использовании двух отдельных команд awk, можно использовать END
блок для печати чего-то, после того как обработка файла завершена
$ awk '{print $1,$2}END{print "\n"}' data.txt; awk '{print $3,$4}' data.txt
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
, Так как блок за 3$ является в основном тем же самым много раз (представьте "AGE" в виде строки), Вы не должны хранить его, но можно сохранить 4$ в ассоциативный массив. Затем в блоке КОНЦА можно выполнить итерации по сохраненным значениям после печати новой строки.
$ awk '{print $1,$2;age[i++]=$4}END{print"";for(var in age) print "AGE",age[var]}' data.txt
John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543