处理if语句时对awk命令的混淆

处理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”(带双引号)。进一步阅读: 此外,您正在每行设置它,因此它不会影响第

判断第一个字段是否为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”
(带双引号)。进一步阅读:

此外,您正在每行设置它,因此它不会影响第一行。您要使用:

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@fedorqui
awk'{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@fedorqui
awk'{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