在 awk 中根据条件初始化字段分隔符

initialising field seperators on condition in awk

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

{if([=10=] ~ /.*youtube.*/){FS="=";print }}

此代码未处理第一个 line.How 来解决此问题?

您可以使用 split。 Eks 从第三个字段中获取中间日期 green

echo "on,cat ,blue|green|red,more" | awk -F, '{split(,a,"|");print a[2]}'
green

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

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

所有这些都将打印 two

但它们在何时可以使用时可能会产生一些不同的影响。

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

这不起作用并且没有输出。

awk 'BEGIN{print FS}' FS=,

回到你的问题:

这个:

awk '{if([=14=] ~ /.*youtube.*/){FS="=";print }}' file

应该是:

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

您不需要测试正则表达式前后的任何字符,因此:

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

这还可以进一步简化:

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

如果数据是这样的:

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

然后这样做:

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