Как использовать Awk для печати полей и столбцов в файле
В этой части серии статей о командах Linux Awk мы рассмотрим одну из наиболее важных функций Awk — редактирование полей.
Полезно знать, что Awk автоматически разделяет предоставленные ему входные строки на поля, а поле можно определить как набор символов, которые отделены от других полей внутренним разделителем полей.
Если вы знакомы с Unix/Linux или программируете на bash, вам следует знать, что такое переменная внутреннего разделителя полей (IFS). IFS по умолчанию в Awk — это табуляция и пробел.
Вот как работает идея разделения полей в Awk: когда он встречает строку ввода, согласно определению IFS, первым набором символов является первое поле, доступ к которому осуществляется с помощью $1<, второй набор символов — это поле два, доступ к которому осуществляется с помощью $2, третий набор символов — это поле три, доступ к которому осуществляется с помощью $3 и т. д. до последнего набора символов.
Чтобы лучше понять редактирование полей Awk, давайте посмотрим на примеры ниже:
Пример 1: Я создал текстовый файл с именем tecmintinfo.txt.
vi tecmintinfo.txt
cat tecmintinfo.txt
Затем из командной строки я пытаюсь напечатать поля первое, второе и третье из файла tecmintinfo.txt. > используя команду ниже:
$ awk '//{print $1 $2 $3 }' tecmintinfo.txt
TecMint.comisthe
Из приведенного выше вывода вы можете видеть, что символы из первых трех полей печатаются на основе определенного IFS, который представляет собой пробел:
- Доступ к первому полю, «TecMint.com», осуществляется с помощью
$1
. - Доступ к второму полю, «is», осуществляется с помощью
$2
. - Доступ к третьему полю, «the», осуществляется с помощью
$3
.
Если вы заметили, что при выводе на печать значения полей не разделены, и именно так ведет себя печать по умолчанию.
Чтобы четко видеть вывод с пробелами между значениями полей, вам необходимо добавить оператор (,)
следующим образом:
$ awk '//{print $1, $2, $3; }' tecmintinfo.txt
TecMint.com is the
Важно отметить и всегда помнить одну важную вещь: использование ($)
в Awk отличается от его использования в сценариях оболочки.
В сценариях оболочки ($)
используется для доступа к значениям переменных, тогда как в Awk ($)
он используется только при доступе к содержимому поле, но не для доступа к значению переменных.
Пример 2: Давайте рассмотрим еще один пример, используя файл, содержащий несколько строк, с именем my_shoping.list.
No Item_Name Unit_Price Quantity Price
1 Mouse #20,000 1 #20,000
2 Monitor #500,000 1 #500,000
3 RAM_Chips #150,000 2 #300,000
4 Ethernet_Cables #30,000 4 #120,000
Допустим, вы хотите напечатать только Unit_Price
каждого товара в списке покупок, вам нужно будет запустить команду ниже:
$ awk '//{print $2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
В Awk также есть команда printf
, которая помогает вам удобно форматировать выходные данные, поскольку вы можете видеть, что приведенный выше вывод недостаточно ясен.
Использование printf
для форматирования вывода Item_Name и Unit_Price:
$ awk '//{printf "%-10s %s\n",$2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
Краткое содержание
Редактирование полей очень важно при использовании Awk для фильтрации текста или строк. Оно помогает получить определенные данные в столбцах списка. И всегда помните, что использование оператора ($)
в Awk отличается от использования в сценариях оболочки.
Я надеюсь, что статья была для вас полезна, и если у вас есть дополнительная информация или вопросы, вы можете оставить комментарий в разделе комментариев.