Linux awk 指定输入输出分隔符
awk是一种通用脚本语言,用于高级文本处理的。它主要用作报告和分析工具
awk是一种通用脚本语言,用于高级文本处理的。它主要用作报告和分析工具。与大多数其他程序性编程语言不同。
Awk是数据驱动的,这意味着您必须定义一组针对输入文本要执行的操作。它获取输入数据,对其进行转换,然后将结果发送到标准输出。
awk有几种不同的实现。我们将使用Awk的GNU实现,称为gawk。在大多数Linux发行版可用,awk
命令只gawk
的符号链接。
在本教程的所有示例中,我们将使用teams.txt文件作为awk的输入,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