linux中使用 awk 输出文本中的字段和列

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

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

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

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

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

字段一是 “TecMint.com”,可以通过 $1 来访问。
字段二是 “is”,可以通过 $2 来访问。
字段三是 “the”,可以通过 $3 来访问。
如果你注意观察输出的话可以发现,输出的字段值并没有被分隔开,这是 print 函数默认的行为。

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

$ 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 
     
如果你只想输出购物清单上每一个物品的单价,你只需运行下面的命令:

$ 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 中 ($) 操作符的用法与其在 shell 脚本中的用法是不同的!

时间: 2024-10-05 04:00:52

linux中使用 awk 输出文本中的字段和列的相关文章

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

在 Awk 系列的这一节中,我们将看到 awk 最重要的特性之一,字段编辑. 首先我们要知道,Awk 能够自动将输入的行,分隔为若干字段.每一个字段就是一组字符,它们和其他的字段由一个内部字段分隔符分隔开来. Awk 输出字段和列 如果你熟悉 Unix/Linux 或者懂得 bash shell 编程,那么你应该知道什么是内部字段分隔符(IFS)变量.awk 中默认的 IFS 是制表符和空格. awk 中的字段分隔符的工作原理如下:当读到一行输入时,将它按照指定的 IFS 分割为不同字段,第一组

UNIX(freebsd)如何对文本中的文字

  文本中的文字排序演示 登录终端执行"sort 文件全名"并确定. unix文本文字排序sort命令参数 sort命令参数 执行结果 -d telephone book(电话簿)排序法进行排序.该选项在执行排序时,将忽略除字母.数字和空格以外的其他字符. -b 执行时,将忽略前置的空格. -f 执行排序时,把小写字母转换为大写字母.适用于创建区分大小写的排序. -n 根据字段的数字值排序. -t 更改字母分隔符(sort用该分隔符来表明珍上字母结束,下一个字段开始).默认情况下,so

《正则表达式经典实例(第2版)》——2.21 把部分的正则匹配添加到替代文本中

2.21 把部分的正则匹配添加到替代文本中 问题描述匹配任意10个数字的连续序列,如1234567890.并把这个序列转换成(美国)电话号码的常见格式,如(123) 456-7890, 解决方案正则表达式 \b(\d{3})(\d{3})(\d{4})\b 正则选项:无 正则流派:.NET.Java.JavaScript.PCRE.Perl.Python.Ruby 替代文本 ($1)●$2-$3 替代文本流派:.NET.Java.JavaScript.PHP.Perl (${1})●${2}-$

linux中使用 awk 和正则表达式过滤文本或文件中的字符串

当我们在 Unix/Linux 下使用特定的命令从字符串或文件中读取或编辑文本时,我们经常需要过滤输出以得到感兴趣的部分.这时正则表达式就派上用场了. 什么是正则表达式? 正则表达式可以定义为代表若干个字符序列的字符串.它最重要的功能之一就是它允许你过滤一条命令或一个文件的输出.编辑文本或配置文件的一部分等等. 正则表达式的特点 正则表达式由以下内容组合而成: 普通字符,例如空格.下划线.A-Z.a-z.0-9. 可以扩展为普通字符的元字符,它们包括: (.) 它匹配除了换行符外的任何单个字符.

linux下shell及awk统计日志中相同ip的访问次数

awk统计ip访问次数 现在有一个文件,数据量大概在200多万条记录,想用shell的awk做统计,文件的格式如下 #关键字#URL#IP地址# test|123|1 test|123|1 test|123|2 test2|12|1 test2|123|1 test2|123|2 现在想要统计的结果是:查看同一个关键字和URL总的访问的次数,以及多少个不同的IP,输出到一个文件中 SQL的实现就很简单 select keyword ,url ,count(1),count(distinct IP

tab-C#如何获得文本中Tab符的输出长度

问题描述 C#如何获得文本中Tab符的输出长度 希望得到的是视觉长度,不是Tab字符长度,字符/t长度 /t都是1 解决方案 http://msdn.microsoft.com/zh-cn/library/6xe5hazb.aspx 解决方案二: http://www.csharpwin.com/csharpspace/11281r9636.shtml 解决方案三: http://blog.sina.com.cn/s/blog_49209726010006fw.html 解决方案四: Tab 的

linux中使用 awk 复合表达式详解

一直以来在查对条件是否匹配时,我们使用的都是简单的表达式.那如果你想用超过一个表达式来查对特定的条件呢? 本文中,我们将看看如何在过滤文本和字符串时,结合多个表达式,即复合表达式,用以查对条件. awk 的复合表达式可由表示"与"的组合操作符 && 和表示"或"的 || 构成. 复合表达式的常规写法如下: ( 第一个表达式 ) && ( 第二个表达式 ) 这里只有当"第一个表达式" 和"第二个表达式&qu

windows-(1)window下按回车键输入的是 , 还是 (2)window文本中换行符号是 ,还是

问题描述 (1)window下按回车键输入的是n, 还是nr (2)window文本中换行符号是n,还是nr 大家好: 我看到帖子里说,windows下文本换行是nr,而Linux下的是n.所有我就想求证一下. 帖子的地址: http://www.linuxdiyf.com/viewarticle.php?id=94893 以下是我写的代码: hello.txt里面的文本内容: hello world 测试代码: int main() { FILE *fp; fp = fopen("hello.

如何截取文本中特定字符串之间的数据

问题描述 如何截取文本中特定字符串之间的数据 输入: face=Arial.............不惜血本,以铺天盖地的广告提高知晓率...........................babababababababa 字符串: 开始字符串:face=Arial 结束字符串:babababababababa 输出: 输出上面两个字符串之间的数据. ?注:因为是从网上扒下来很多数据,要解析出特定字符串间的数据. 如何编程实现,或者用linux上的脚本也可以 解决方案 字符串函数就可以解决了