awk 系列:如何使用 awk 输出文本中的字段和列

简介:

在 Awk 系列的这一节中,我们将看到 awk 最重要的特性之一,字段编辑。

首先我们要知道,Awk 能够自动将输入的行,分隔为若干字段。每一个字段就是一组字符,它们和其他的字段由一个内部字段分隔符分隔开来。

Awk 输出字段和列

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

awk 中的字段分隔符的工作原理如下:当读到一行输入时,将它按照指定的 IFS 分割为不同字段,第一组字符就是字段一,可以通过 $1 来访问,第二组字符就是字段二,可以通过 $2 来访问,第三组字符就是字段三,可以通过 $3 来访问,以此类推,直到最后一组字符。

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

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


 
 
  1. # vi tecmintinfo.txt
  2. # cat tecmintinfo.txt

在 Linux 上创建一个文件

在 Linux 上创建一个文件

然后在命令行中,我试着使用下面的命令从文本 tecmintinfo.txt 中输出第一个,第二个,以及第三个字段。


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

从上面的输出中你可以看到,前三个字段的字符是以空格为分隔符输出的:

  • 字段一是 “TecMint.com”,可以通过 $1 来访问。
  • 字段二是 “is”,可以通过 $2 来访问。
  • 字段三是 “the”,可以通过 $3 来访问。

如果你注意观察输出的话可以发现,输出的字段值并没有被分隔开,这是 print 函数默认的行为。

为了使输出看得更清楚,输出的字段值之间使用空格分开,你需要添加 (,) 操作符。


 
 
  1. $ awk '//{print $1, $2, $3; }' tecmintinfo.txt
  2. TecMint.com is the

需要记住而且非常重要的是,($) 在 awk 和在 shell 脚本中的使用是截然不同的!

在 shell 脚本中,($) 被用来获取变量的值。而在 awk 中,($) 只有在获取字段的值时才会用到,不能用于获取变量的值。

例 2:让我们再看一个例子,用到了一个名为 my_shoping.list 的包含多行的文件。


 
 
  1. No Item_Name Unit_Price Quantity Price
  2. 1 Mouse #20,000 1 #20,000
  3. 2 Monitor #500,000 1 #500,000
  4. 3 RAM_Chips #150,000 2 #300,000
  5. 4 Ethernet_Cables #30,000 4 #120,000

如果你只想输出购物清单上每一个物品的单价,你只需运行下面的命令:


 
 
  1. $ awk '//{print $2, $3 }' my_shopping.txt
  2. Item_Name Unit_Price
  3. Mouse #20,000
  4. Monitor #500,000
  5. RAM_Chips #150,000
  6. Ethernet_Cables #30,000

可以看到上面的输出不够清晰,awk 还有一个 printf 的命令,可以帮助你将输出格式化。

使用 printf 来格式化 Item_Name 和 Unit_Price 的输出:


 
 
  1. $ awk '//{printf "%-10s %s\n",$2, $3 }' my_shopping.txt
  2. Item_Name Unit_Price
  3. Mouse #20,000
  4. Monitor #500,000
  5. RAM_Chips #150,000
  6. Ethernet_Cables #30,000

总结

使用 awk 过滤文本或字符串时,字段编辑的功能是非常重要的。它能够帮助你从一个表的数据中得到特定的列。一定要记住的是,awk 中 ($) 操作符的用法与其在 shell 脚本中的用法是不同的!

原文发布时间为:2016-07-19

本文来自云栖社区合作伙伴“Linux中国”


相关文章
|
存储 运维 负载均衡
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
2327 0
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
|
10月前
|
前端开发 机器人 UED
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
|
算法 程序员
程序设计的五个步骤
程序的设计过程,并不是立刻就进行代码设计,一般来讲包括设置文件的存放位置、说明书的设计、代码设计、程序测试、程序调试、注释说明。
905 6
|
小程序 Android开发 iOS开发
微信小程序-虚拟支付:适用场景 / iPhone调试用支付成功,Android调用失败,提示“小程序支付能力已被限制” / “errMsg“.“requestPayment:fail banned”
微信小程序-虚拟支付:适用场景 / iPhone调试用支付成功,Android调用失败,提示“小程序支付能力已被限制” / “errMsg“.“requestPayment:fail banned”
1005 0
|
存储 数据安全/隐私保护 iOS开发
|
SQL 关系型数据库 数据库
|
弹性计算 网络安全
阿里云服务器:更换指南教你轻松更改IP地址
阿里云服务器可以更换IP地址吗?可以的,创建6小时以内的云服务器ECS可以免费更换三次公网IP地址,超过6小时的云服务器,可以将公网固定IP地址转成弹性EIP,然后通过换绑EIP的方式来更换IP地址。阿里云百科分享阿里云服务器更换IP地址的限制条件及操作方法
1166 0
|
移动开发 JavaScript Android开发
iOS12网页视频播放点击全屏按钮会导致闪退
iOS12网页视频播放点击全屏按钮会导致闪退
456 0
|
存储 弹性计算 固态存储
阿里云服务器ECS与轻量应用服务器最新收费标准及活动价格表
本文整理汇总了阿里云服务器ECS与轻量应用服务器最新收费标准及活动价格表,可供新手用户了解云服务器与轻量应用服务器的收费标准及最新活动价格情况,从而根据自己的情况选择合适的云服务器或轻量应用服务器。
950 0
阿里云服务器ECS与轻量应用服务器最新收费标准及活动价格表
如何将VS2019的解决方案资源管理器移动到左边
如何将VS2019的解决方案资源管理器移动到左边
1054 0
如何将VS2019的解决方案资源管理器移动到左边