Поиск по сайту:

Как использовать 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, который представляет собой пробел:

  1. Доступ к первому полю, «TecMint.com», осуществляется с помощью $1.
  2. Доступ к второму полю, «is», осуществляется с помощью $2.
  3. Доступ к третьему полю, «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 отличается от использования в сценариях оболочки.

Я надеюсь, что статья была для вас полезна, и если у вас есть дополнительная информация или вопросы, вы можете оставить комментарий в разделе комментариев.