在 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
我知道在 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