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

Как я реализую каретку или возврат новой строки в каждой команде 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

.. который, конечно, нежелателен.

6
задан 17 October 2016 в 21:36

2 ответа

Когда Вы работаете из сценария оболочки, просто добавьте 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
<час>
7
ответ дан 23 November 2019 в 07:37

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

ARGIND с НОМЕРОМ и переменными 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

Использование пункта

КОНЦА, Как упомянуто в комментариях в соответствии с ответом 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
1
ответ дан 23 November 2019 в 07:37

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

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