Как реализовать возврат каретки или новой строки в каждой команде awk в сценарии оболочки, так что вывод каждой команды будет отделен от следующего?
Возможно, мне нужна дополнительная спецификация. У меня есть две команды awk, перечисленные ниже:
awk {print $1, $2}, команда awk 1, выходы:
John Bender
Bohn Jender
Jen Bondher
awk '{print $3, $4}', команда 2, выходы:
[ f2]При объединении в сценарии оболочки и запуске с ./<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
.., что, безусловно, нежелательно.
Просто потому, что это возможно, вот какие альтернативные подходы могут быть приняты.
Этот подход проходит через файл дважды, и в данный момент
Для обработки одного и того же файла, но при извлечении различной информации файл дважды указывается в командной строке. Как мы различаем, когда мы запускаем первый файл (для извлечения полей $ 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 можно использовать [ f8], чтобы распечатать что-то после завершения обработки файла
$ 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 в ассоциативный массив. Затем в END-блоке вы можете перебирать сохраненные значения после печати новой строки.
$ 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