在awk条件下初始化字段分隔符

在awk条件下初始化字段分隔符,awk,gawk,Awk,Gawk,我知道在BEGIN中初始化FS是正确的做法,但如果不同的行(包含特定模式的行)需要不同的字段分隔符怎么办?我的awk脚本是 {if($0 ~ /.*youtube.*/){FS="=";print $2}} 此代码未处理第一行。如何修复此问题?您可以使用拆分。Eks从第三个字段获取中间日期绿色 echo "on,cat ,blue|green|red,more" | awk -F, '{split($3,a,"|");print a[2]}' green 而且您不仅可以在BEGIN块中设置字

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

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

此代码未处理第一行。如何修复此问题?

您可以使用
拆分
。Eks从第三个字段获取中间日期
绿色

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}'
所有这些将打印两个

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

awk -F, 'BEGIN{print FS}'
,
这不起作用,也没有输出

awk 'BEGIN{print FS}' FS=,

回到你的问题:

这:

应该是:

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
然后像这样做:

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

输入为youtube=thisisyoutube1//从这里开始youtube=thisisyoutube2 youtube=thisisyoutube3 youtube=thisisyoutube4 yautube=thisisyoutube4 yautube=thisisyoutube4我的输出为//新行thisisyoutube2 thisisyoutube3 thisisyoutube4thisisnottobeprinted@sairamkolla不可能在你的评论中读到这一点,更新您的原始帖子,并在代码周围使用代码标签
{}
。发布输入数据以及从中获取的内容。除了split()的第三个参数外,其他都是一个regexp(实际上是一个字段分隔符,它是regexp的一种类型),而不是一个字符串,所以使用regexp分隔符(即
split($0,a,/=)
而不是
split($0,a,“=”)
),这样awk就不必将该参数从字符串转换为regexp。这对争论的某些内容很重要,所以养成避免意外的好习惯。