我知道在BEGIN初始化FS是正确的做法,但如果我需要不同的字段分隔符(包含特定模式的行),该怎么办?例如:我的awk脚本是
{if($0 ~ /.*youtube.*/){FS="=";print $2}}
此代码未处理第一行。如何解决此问题?
答案 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