myfreax
awk

Linux awk 指定输入输出分隔符

awk是一种通用脚本语言,用于高级文本处理的。它主要用作报告和分析工具

5 min read
By myfreax
Linux awk 指定输入输出分隔符
linux awk 分隔符

awk是一种通用脚本语言,用于高级文本处理的。它主要用作报告和分析工具。与大多数其他程序性编程语言不同。

Awk是数据驱动的,这意味着您必须定义一组针对输入文本要执行的操作。它获取输入数据,对其进行转换,然后将结果发送到标准输出。

awk有几种不同的实现。我们将使用Awk的GNU实现,称为gawk。在大多数Linux发行版可用,awk命令只gawk的符号链接。

在本教程的所有示例中,我们将使用teams.txt文件作为awk的输入,teams.txt文件内容如下所示。

Bucks Milwaukee    60 22 0.732 
Raptors Toronto    58 24 0.707 
76ers Philadelphia 51 31 0.622
Celtics Boston     49 33 0.598
Pacers Indiana     48 34 0.585
teams.txt

awk命令

要使用awk处理文本,需要编写程序来告诉awk命令该做什么。程序由一系列规则和用户定义的函数组成。

每个规则包含模式pattern和操作action的键值对。多个规则使用换行符或分号;分隔。通常awk程序看起来就像这样pattern { action }

awk处理数据时,如果模式与记录匹配,awk将会对记录执行指定的操作。当规则没有模式时,所有记录/行都匹配。

内置变量

Awk具有许多内置变量,这些变量包含非常有用的信息,并允许您控制程序的处理方式。

这是一些最常见的内置变量。NF记录中的字段总数。NR当前记录的编号。FILENAME当前正在处理文件名称。

FS字段分隔符。RS记录分隔符。OFS输出字段分隔符。ORS输出记录分隔符。

AWK变量可以在程序的任何行声明。要为整个程序定义变量,请将其放在BEGIN模式中。

例如命令awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt。将会打印打印文件名和行数,即记录总数。

awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.

输入分隔符

字段分隔符的默认是空格符,你也可以指定为任意数量的字符,空格,制表符等任何字符。

要修改字段分隔符。可以在awk程序声明FS变量来进行修改。也可以使用awk命令的-F选项更改字段分隔符。

命令awk 'BEGIN { FS = "." } { print $1,$2 }' teams.txt将字段分隔符设置为.

使用awk的-F选项的等价命令是awk -F "." '{ print $1,$2 }' teams.txt

awk 'BEGIN { FS = "." } { print $1,$2 }' teams.txt
awk -F "." '{ print $1,$2 }' teams.txt
Bucks Milwaukee    60 22 0 732 
Raptors Toronto    58 24 0 707 
76ers Philadelphia 51 31 0 622
Celtics Boston     49 33 0 598
Pacers Indiana     48 34 0 585

记录分隔符默认是换行符,可以通过修改RS变量进行更改。与字段的分隔符一样你可以指定为任意数量的字符,空格,制表符等任何字符。

例如命令awk 'BEGIN { RS = "." } { print $1 }' teams.txt将会修改记录分隔符为.

awk 'BEGIN { RS = "." } { print $1 }' teams.txt
Bucks Milwaukee    60 22 0
732 
Raptors Toronto    58 24 0
707 
76ers Philadelphia 51 31 0
622
Celtics Boston     49 33 0
598
Pacers Indiana     48 34 0
585

输出分隔符

需要在awk的输出指定其它分隔符时,可以通过awk命令的-v选项指定内置变量OFS

命令awk -v OFS="@" '{ print $1,$2 }' teams.txt使用@符号作为输出字段的分隔符号。

awk -v OFS="@" '{ print $1,$2 }' teams.txt

为了使您可以更好地控制输出格式,你可以使用printf语句。例如命令awk '{ printf "%3d. %s\n", NR, $0 }' teams.txt将会为记录插入行号。

NR变量是当前记录的编号,将会插入到占位符号%3d$0变量表示当前正在处理的记录,将会插入到占位符号%s

printf不会在每条记录后创建换行符,因此还在最后使用\n 换行符,进行对记录的换行。

awk '{ printf "%3d. %s\n", NR, $0 }' teams.txt
  1. Bucks Milwaukee    60 22 0.732 
  2. Raptors Toronto    58 24 0.707 
  3. 76ers Philadelphia 51 31 0.622
  4. Celtics Boston     49 33 0.598
  5. Pacers Indiana     48 34 0.585
Linux Awk命令实例教程 | myfreax
Awk是一种用于高级文本处理的通用脚本语言。 它主要用作报告和分析工具。与大多数其他程序性编程语言不同,awk是数据驱动的
Linux Awk命令实例教程