Примеры print

!awk 'BEGIN { print "line one\nline two\nline three" }'
line one
line two
line three

Пробел — разделитель по-умолчанию.

!awk 'BEGIN { print "line one","line two","line three" }'
line one line two line three
!awk '{ print $1,$2 }' inventory-shipped | head -n3
Jan 13
Feb 15
Mar 15

Печать полей без запятой приводит к «склеиванию» полей

!awk '{ print $1 $2 }' inventory-shipped | head -n3
Jan13
Feb15
Mar15
!awk 'BEGIN {print "Month", "Crates";\
             print "-----", "------"}{ print $1," ",$2 }' inventory-shipped | head -n5
Month Crates
----- ------
Jan   13
Feb   15
Mar   15

Разделитель полей вывода (OFS)

Разделитель по-умолчанию — пробел » «. Разделитель можно задать явно через переменную OFS

!awk 'BEGIN {OFS="-->"} { print $1,$2 }' inventory-shipped | head -n3
Jan-->13
Feb-->15
Mar-->15

Разделитель строк вывода (ORS)

Разделитель по-умолчанию — новая строка «\n». Разделитель можно задать явно через переменную ORS

!awk 'BEGIN {OFS="-->"; ORS = "\n\n"} { print $1,$2 }' inventory-shipped | head -n3
Jan-->13

Feb-->15
!awk -v OFS='-->' -v ORS='\n\n' '{ print $1,$2 }' inventory-shipped | head -n3
Jan-->13

Feb-->15
!awk '{ print $1,$2 }' OFS='-->' ORS='\n\n' inventory-shipped | head -n3
Jan-->13

Feb-->15

Красивая печать при помощи printf

printf format, item1, item2, ...

Печать при помощи printf имеет несколько особенностей:

  • формат выдачи на печать задается одной текстовой переменной
  • printf в отличие от print, не добавляет символ новой строки \n автоматически
  • форматирование в printf состоит из ДВУХ ОБЯЗАТЕЛЬНЫХ СИМВОЛОВ и модификаторов:
    • % — символ начала форматировани, ОБЯЗАТЕЛЬНЫЙ символ
    • s,d,f,g,e ..... — символ формата, ОБЯЗАТЕЛЬНЫЙ символ
      • s — текст
      • d — целое число
      • f — число с запятой
      • g — или экспоненциальная форма вывода (e) или число с запятой (f), что короче
      • e — экспоненциальная форма вывода
    • модификаторы, например:
      • %10s — текст шириной 10 позиций. Любое число означает ширину поля (для числа начинающегося с 0 см. ниже). По умолчанию, выводимая величина выравнивается по правому краю.
      • %-10s-, выравнивание по левому краю
      • %010d- 0 как первый модификатор, добавляет 0 перед числом до ширины поля в 10 знаков. Работает только:
        • для чисел
        • если заявленное поле шире чем число, которое нужно напечатать
      • %+d+ — всегда добавлять знак
      • % d, пробел, только для цифр. Добавлять пробел для положительных цифр, отображать минус для отрицательных
      • %'.6f — апосторф ', число должно содержать тысячный разделитель (в целой части числа). Работает только для чисел. Добавляется как '\''
      • %.6f — точка .n. Значение применимо только для числовых форматов и означает:
        • %d , %i , %o , %u , %x , %X — ширина поля, если целое число меньше — спереди добавляются 0
        • %e , %E , %f , %F — количество знаков после запятой
        • %sМАКСИМАЛЬНОЕ количество знаков для печати
!awk 'BEGIN {printf "%+.2e", 6321.67867868}'
+6.32e+03
!awk 'BEGIN {printf "%010'\''+.2f", 6321.67867868}'
+06,321.68
!awk 'BEGIN {printf "%.2d", 1234}'
1234
!awk 'BEGIN {printf "%.6i", 1234}' # 6 -- ширина поля
001234
!awk 'BEGIN {printf "%.2s", "abcd"}'
ab
!awk '{ printf "%-10s %s\n", $1, $2 }' mail-list | head -n5
Amelia     555-5553
Anthony    555-3412
Becky      555-7685
Bill       555-1675
Broderick  555-0542

Формат второго поля %s ОБЯЗАТЕЛЕН, т.к. если попробовать распечатать второе поле как число, то «как число» будет распечтана только первая часть телефонного номера до дефиса.

!awk '{ printf "%-10s %f\n", $1, $2 }' mail-list | head -n5
Amelia     555.000000
Anthony    555.000000
Becky      555.000000
Bill       555.000000
Broderick  555.000000
!awk 'BEGIN { printf "%-10s %s\n", "Name", "Number";\
              printf "%-10s %s\n", "----", "------" }\
            { printf "%-10s %s\n", $1, $2 }' mail-list
Name       Number
----       ------
Amelia     555-5553
Anthony    555-3412
Becky      555-7685
Bill       555-1675
Broderick  555-0542
Camilla    555-2912
Fabius     555-1234
Julie      555-6699
Martin     555-6480
Samuel     555-3430
Jean-Paul  555-2127

Повторяющийся формат может быть присвоен переменной

!awk 'BEGIN { format = "%-10s %s\n"; \
              printf format, "Name", "Number";\
              printf format, "----", "------" }\
            { printf format, $1, $2 }' mail-list
Name       Number
----       ------
Amelia     555-5553
Anthony    555-3412
Becky      555-7685
Bill       555-1675
Broderick  555-0542
Camilla    555-2912
Fabius     555-1234
Julie      555-6699
Martin     555-6480
Samuel     555-3430
Jean-Paul  555-2127

Печать в файл

  • print items > output-file Перед началом печати первой строки в файл — файл СТИРАЕТСЯ. Последующие строки ДОБАВЛЯЮТСЯ
  • print items >> output-file — строки добавляются
!awk '{printf "%02d. %s\n", NR, $1 > "name.txt"; print $2 > "telephone.txt"}' mail-list
cat name.txt | tail -n3
09. Martin
10. Samuel
11. Jean-Paul
Write a comment:

*

Your email address will not be published.

© 2014 In R we trust.
Top
Follow us: