在awk中初始化字段分隔符

时间:2015-02-28 07:36:58

标签: awk gawk

我知道在BEGIN初始化FS是正确的做法,但如果我需要不同的字段分隔符(包含特定模式的行),该怎么办?例如:我的awk脚本是

{if($0 ~ /.*youtube.*/){FS="=";print $2}}

此代码未处理第一行。如何解决此问题?

1 个答案:

答案 0 :(得分:2)

您可以使用split。 Eks从第三个字段green

获得中间日期
echo "on,cat ,blue|green|red,more" | awk -F, '{split($3,a,"|");print a[2]}'
green

BEGIN阻止不仅可以设置字段分隔符:

echo "on,two,three" | awk -F, '{print $2}'
echo "on,two,three" | awk '{print $2}' FS=,
echo "on,two,three" | awk 'BEGIN{FS=","} {print $2}'
echo "on,two,three" | awk -v FS=, '{print $2}'

所有这些都会打印two

但是它们可以在何时使用时产生不同的影响。

awk -F, 'BEGIN{print FS}'
,

这不起作用,也没有输出。

awk 'BEGIN{print FS}' FS=,

回到你的问题:

此:

awk '{if($0 ~ /.*youtube.*/){FS="=";print $2}}' file

应该是:

awk '{if($0 ~ /.*youtube.*/){split($0,a,"=");print a[2]}}' file

您不需要在正则表达式之前和之后测试任何字符,所以:

awk '{if($0 ~ /youtube/){split($0,a,"=");print a[2]}}' file

这可以更简化:

awk '/youtube/ {split($0,a,"=");print a[2]}' file

如果数据是这样的:

cat file
youtube=thisisyoutube1 //starts here
youtube=thisisyoutube2
youtube=thisisyoutube3
youtube=thisisyoutube4
yautube=thisisnottobeprinted

然后这样做:

awk -F= '/youtube/ {split($2,a," ");print a[1]}' file
thisisyoutube1
thisisyoutube2
thisisyoutube3
thisisyoutube4