gawk中分隔符内建变量
内建变量值得是shell中已经定义过可以直接使用的变量
,shell中用于分割作用的内建变量有5
个,之前已经提到过一个FS
,FS
是输入字段的分隔符,除了FS
还有FIELDWIDTH
,OFS
,RS
,ORS
。
比如文件data的内容为:
This is Fruit:apple
That is City:Beijing
These are books:maths
Those are animals:dogs
1 OFS对输出进行分割
默认情况下,对输出进行分割的是空格
。当然如果设置OFS的话,那么就能修改输出分隔符了,比如输入:
gawk 'BEGIN {FS=":";OFS="<--->"} {print $1,$2}' data
运行后结果为:
This is Fruit<--->apple
That is City<--->Beijing
These are books<--->maths
Those are animals<--->dogs
如上所示,在BEGIN里面把输入分隔符
和输出分隔符
都改了。
2 FIELDWIDTHS按宽度取出数据
FIELDWIDTHS
设定之后,gawk
根据输入的数字,在输入的一行中,去截取对应的长度,同时FIELDWIDTHS
设定之后FS
就不起作用了。比如对于文本data的数据为:
This is Fruit:apple
That is City:Beijing
These are books:maths
Those are animals:dogs
输入:
gawk 'BEGIN{FIELDWIDTHS="4 1 2 1 5 6";OFS="<--->"} {print $1,$3,$5,$6}' data
运行后结果为:
This<--->is<--->Fruit<--->:apple
That<--->is<--->City:<--->Beijin
Thes<---> a<--->e boo<--->ks:mat
Thos<---> a<--->e ani<--->mals:d
3 RS作为输入记录的分隔符
默认情况下,RS
为换行符,也就说对于一个文本,每一行就是一个新的记录。之前的比如$1
,$2
这种都是对一个记录去处理的。有时候我们希望多行数据为一个记录的时候,可以修改RS
的值。比如有一个文本data2的内容为:
Fan wei
China Beijing
Male
Actor
Ji Xiao Lan
Qing Beijing
Male
Guan
以上内容实际上是两段,现在想要把一段当成一个整体,并且整段中的每一行当做一个数据段。这里只要把FS
设置为换行符\n
,并把RS
设置成空行。输入如下:
gawk 'BEGIN{FS="\n"; RS=""} {print $1,$2}' data3
运行后结果为:
Fan wei China Beijing
Ji Xiao Lan Qing Beijing
4 ORS作为输出记录的分隔符
同理,ORS作为输出记录的分隔符,默认也是换行符\n。当然也可以修改这个变量,输入:
gawk 'BEGIN{FS="\n"; RS="";ORS="<>\n"} {print $1,$2}' data3
data3的内容为:
Fan wei
China Beijing
Male
Actor
Ji Xiao Lan
Qing Beijing
Male
Guan
运行后结果为:
Fan wei China Beijing<>
Ji Xiao Lan Qing Beijing<>