上篇文章介绍了awk的语法和基础的使用方法,这里将akw的分隔符单独拿出来说一说。
用法
默认awk使用空白字符,即空格或tab作为分隔符,如果需要指定不同的分隔符,可以使用-F参数或对变量FS赋值
例如:
1 |
awk -F ':' '{print $1 "\t" $2}' filename |
其中分隔符可用单引号或双引号包围,具体看使用情况,其意义与shell中的单引号双引号一样。
实例:
# echo "123:456" | awk -F ":" '{print $1 "\t" $2}'
123 456
或者:
1 |
awk 'BEGIN{FS=":"} {print $1 "\t" $2}' filename |
注意分隔符赋值的语法前的BEGIN关键字,同时分隔符只能用双引号包围。
实例:
# echo "123:456" | awk 'BEGIN{FS=":"} {print $1 "\t" $2}' 123 456
同时awk也支持以字符串作为分隔符,例如:
1 |
awk -F 'ABC' '{print $1 "\t" $2}' filename |
多个连续分隔符
如果处理过程中碰到多个连续的分隔符时,awk会怎么处理呢?我们以实验来说明。
实例:
1 |
echo "123:456::789" | awk -F ":" '{print $1 "\t" $2 "\t" $3}' |
先想象一下结果会如何?
.
.
.
.
.
.
.
.
.
.
.
答案揭晓:
# echo "123:456::789" | awk -F ":" '{print $1 "\t" $2 "\t" $3}'
123 456
怎么样,789并没有输出出来。为什么?
注意到中间的::了吗?awk将这两个分隔符中间并不存在的字符也放入了一个域当中去填充,结果$3就变成了空字符串(注意不是空格哦),我们来改变一下写法:
# echo "123:456::789" | awk -F ":" '{print $1 "\t" $2 "\t" $3 "\t" $4}' |cat -A
123^I456^I^I789$
看到其中的【^I】了吗?他表示一个tab占位符,而其中有两个连续的tab中间是没有任何内容的,他就是$3了。
由此可以得出结论,如果有连续出现的分隔符,那么awk也会进行多次切割,将空内容保存到下一个域中。
那么如果我们想避免出现空的域应该怎么做呢?下一节揭晓。
多分隔符
awk分隔符除了支持常规的字符和字符串外,还支持使用正则表达式作为分隔符,这给分隔符创造了非常多种可能。
举个例子:123:456@789,我希望分别将123,456,789划分到3个域中,那么可以这样写:
# echo "123:456@789" | awk -F "[:@]" '{print $1 "\t" $2 "\t" $3}'
123 456 789
也可以这样写:
# echo "123:456@789" | awk -F ":|@" '{print $1 "\t" $2 "\t" $3}'
123 456 789
可以看到结果是一样的。其中[]是标准正则表达式,而|则是扩展正则表达式的写法。
正则表达式分隔符
前面提到正则表达式写法的分隔符,最后这里再做一些扩展。
例1:划分123:456::789:::abc
如果采用上以一节提到的写法会稍显麻烦,是否有更简单的呢?当然,请看下面
# echo "123:456::789:::abc" |awk -F ":+" '{print $1 "\t" $2 "\t" $3 "\t" $4}'
123 456 789 abc
依然很简介,其中的:+表示一个以上的:。
例2:划分123,456.789:abc~def
]# echo "123,456.789:abc~def" |awk -F "[[:punct:]]" '{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5}'
123 456 789 abc def
其中正则表达式写法[:punct:]表示任意标点符号。
以上两个例子其实也就是正则表达式的两种用法而已,暂且就说这么多,文中如有错漏的欢迎指正。
原文链接:awk分隔符用法,转载请注明来源!