处理if语句时对awk命令的混淆
判断第一个字段是否为33时不返回任何内容。这让人困惑。说处理if语句时对awk命令的混淆,awk,Awk,判断第一个字段是否为33时不返回任何内容。这让人困惑。说 $ cat awk.txt 12 32 45 5 2 3 33 11 33 $ cat awk.txt | awk '{FS='\t'} $1==5 {print $0}' 5 2 3 $ cat awk.txt | awk '{FS='\t'} $1==33 {print $0}' 您定义的字段分隔符不正确。要使其成为选项卡,您需要说“\t”(带双引号)。进一步阅读: 此外,您正在每行设置它,因此它不会影响第
$ cat awk.txt
12 32 45
5 2 3
33 11 33
$ cat awk.txt | awk '{FS='\t'} $1==5 {print $0}'
5 2 3
$ cat awk.txt | awk '{FS='\t'} $1==33 {print $0}'
您定义的字段分隔符不正确。要使其成为选项卡,您需要说“\t”
(带双引号)。进一步阅读:
此外,您正在每行设置它,因此它不会影响第一行。您要使用:
awk '{FS='\t'} $1==5 {print}' file
是的,但是为什么它在一种情况下有效,而在另一种情况下无效
awk 'BEGIN{FS='\t'} $1==5' file
您在'\t'
周围使用单引号,这意味着您实际上将3个字符串连接在一起:'{FS='
,\t
和'}$1==5'
,以生成awk命令。shell将\t
解释为t
,因此您的awk脚本实际上是:
awk '{FS='\t'} $1==5' file # it works
awk '{FS='\t'} $1==33' file # it does not work
变量t
未设置,因此将字段分隔符设置为空字符串“”
。这意味着该行被拆分为与字符数量相同的字段。您可以看到它正在执行awk'BEGIN{FS='\t'}{print NF}文件
,这将显示每个记录有多少字段
然后,$1
就是3
,$2
包含第二个3
,
$ cat awk.txt
12 32 45
5 2 3
33 11 33
$ cat awk.txt | awk '{FS='\t'} $1==5 {print $0}'
5 2 3
$ cat awk.txt | awk '{FS='\t'} $1==33 {print $0}'
您定义的字段分隔符不正确。要使其成为选项卡,您需要说“\t”
(带双引号)。进一步阅读:
此外,您正在每行设置它,因此它不会影响第一行。您要使用:
awk '{FS='\t'} $1==5 {print}' file
是的,但是为什么它在一种情况下有效,而在另一种情况下无效
awk 'BEGIN{FS='\t'} $1==5' file
您在'\t'
周围使用单引号,这意味着您实际上将3个字符串连接在一起:'{FS='
,\t
和'}$1==5'
,以生成awk命令。shell将\t
解释为t
,因此您的awk脚本实际上是:
awk '{FS='\t'} $1==5' file # it works
awk '{FS='\t'} $1==33' file # it does not work
变量t
未设置,因此将字段分隔符设置为空字符串“”
。这意味着该行被拆分为与字符数量相同的字段。您可以看到它正在执行awk'BEGIN{FS='\t'}{print NF}文件
,这将显示每个记录有多少字段
然后,
$1
只是3
,$2
包含第二个3
,首先!。在你问之前,你能更好地解释一下你真正想做什么吗?。看
awk '{FS=t} $1==5'
“未来作战系统”首先!。在你问之前,你能更好地解释一下你真正想做什么吗?。看
awk '{FS=t} $1==5'
Fcs
awk'开始{FS=“\t”}$1==33'文件
。注意,您需要在BEGIN
块中用双引号定义FS。@fedorqui我会看到,如果这是第一行,但33在第三行,默认的FS
将在选项卡上拆分(尽管新设置的t
的FS
根本不起作用),@EtanReisner说FS='\t'
任何字符都是不同的字段。您可以通过说awk'{FS='\t';print NR;for(i=1;i@fedorquiawk'{FS='\t'…}'
实际上是awk'{FS=t..}
…哦,不是“t”
,而是变量t
,它是空的,并将FS
设置为空字符串。我明白了。您的awk命令被shell解析为[awk][{FS=][t][}$1==33{print$0}]
。单引号正在以您意想不到的方式配对。您希望在awk脚本中使用双引号,awk无论如何不会对字符串使用单引号。awk'BEGIN{FS=“\t”}$1==33'文件
。注意,您需要在开始
块中用双引号定义FS。@fedorqui我会看到如果这是第一行,但33在第三行,默认的FS
将在选项卡上拆分(尽管新设置的t
的FS
根本不起作用),@EtanReisner,通过说FS='\t'
任何字符都是不同的字段。你可以通过说awk'{FS='\t';print NR;for(i=1;i@fedorquiawk'{FS='\t'…}'
实际上是awk'{FS=t..}
…哦,不是“t”
但变量t
为空,并将FS
设置为空字符串。我明白了。shell正在将您的awk命令解析为[awk][{FS=][t][}$1==33{print$0}]
。单引号以您意想不到的方式配对。您希望在awk脚本中使用双引号,awk无论如何都不会对字符串使用单引号。当然,shell会将\t
解释为t
,因此字段分隔符将是字符t
?为什么这会导致每个字符被解释为一个字段?@TomFenech shell将字符t
粘贴到awk脚本中,awk看到的FS=t
不是FS=“t”
但这是一个空变量。我也有同样的困惑。@EtanReisner很好的解释,我知道什么,但仍在努力理解why@TomFenech一如既往,感谢您在所有意义上的澄清:清晰和语法:D通常shell将\t
解释为t
,因此字段分隔符将是字符t
?为什么会将每个字符解释为一个字段?@TomFenech外壳将字符t
粘贴到awk脚本中,awk看到的FS=t
不是FS=“t”
但这是一个空变量。我也有同样的困惑。@EtanReisner很好的解释,我知道什么,但仍在努力理解why@TomFenech和往常一样,感谢您在所有意义上的澄清:清晰和语法:D