网站搜索

如何使用 awk 打印文件中的字段和列


在 Linux Awk 命令系列的这一部分中,我们将了解 Awk 最重要的功能之一,即字段编辑。

很高兴知道 awk 自动将提供给它的输入行划分为字段,并且字段可以定义为通过内部字段分隔符与其他字段分隔的一组字符。

如果您熟悉 Unix/Linux 或进行 bash shell 编程,那么您应该知道什么是内部字段分隔符(IFS)变量。 Awk 中默认的 IFS 是制表符和空格。

这就是 Awk 中字段分隔的想法:当它遇到输入行时,根据 IFS 定义,第一组字符是字段一,可以使用 $1< 访问该字段。,第二组字符是字段二,使用 $2 访问,第三组字符是字段三,使用 $3 访问,依此类推直到最后一组字符。

为了更好地理解 Awk 字段编辑,让我们看一下下面的示例:

示例 1: 我创建了一个名为 howtoinginfo.txt 的文本文件。

vi tecmintinfo.txt
cat tecmintinfo.txt

然后从命令行,我尝试打印文件 howtoinginfo.txt 中的 firstsecondthird 字段> 使用以下命令:

$ awk '//{print $1 $2 $3 }' tecmintinfo.txt

TecMint.comisthe

从上面的输出中,您可以看到前三个字段的字符是根据 IFS 定义的空格打印的:

  1. 使用 $1 访问字段一,即 “TecMint.com ”
  2. 使用 $2 访问第二个字段,即 “is ”
  3. 使用 $3 访问第三个字段,即“the ”

如果您在打印输出中注意到,字段值没有分隔,这就是默认情况下打印的行为方式。

为了清楚地查看输出并在字段值之间留有空格,您需要添加 (,) 运算符,如下所示:

$ awk '//{print $1, $2, $3; }' tecmintinfo.txt

TecMint.com is the

需要注意并始终记住的一件重要事情是,Awk($) 的使用与 shell 脚本中的使用不同。

在 shell 脚本中 ($) 用于访问变量的值,而在 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_NameUnit_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($) 运算符的使用与 shell 脚本中的不同。

我希望这篇文章对您有所帮助,对于任何需要的其他信息或问题,您可以在评论部分发表评论。