Поместите новую строку после каждой команды

Как реализовать возврат каретки или новой строки в каждой команде 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
задан 18 October 2016 в 07:36

1 ответ

Просто потому, что это возможно, вот какие альтернативные подходы могут быть приняты.

ARGIND с переменными NR и FNR

Этот подход проходит через файл дважды, и в данный момент

Для обработки одного и того же файла, но при извлечении различной информации файл дважды указывается в командной строке. Как мы различаем, когда мы запускаем первый файл (для извлечения полей $ 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

Использование предложения END

Как упоминалось в комментариях в ответ на 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

Изменение в блоке END с ассоциативными массивами

Поскольку ваш блок $ 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
2
ответ дан 23 May 2018 в 05:06
  • 1
    Вы также можете использовать ENDFILE и трюк NR==FNR для обработки двух файлов в одном: awk 'FNR==NR {print $1, $2; next} {print $3, $4} ENDFILE {print ""}' file{,}. – fedorqui 18 October 2016 в 13:04
  • 2
    @fedorqui вы хотели бы опубликовать это как ответ? – Sergiy Kolodyazhnyy 18 October 2016 в 20:44
  • 3
    Не специально, я просто хотел бы предложить альтернативы. Поэтому, если вам это нравится, не стесняйтесь добавить его в свой ответ. – fedorqui 19 October 2016 в 12:24

Другие вопросы по тегам:

Похожие вопросы: