处理if语句时对awk命令的困惑

1 awk

$ 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}'
Run Code Online (Sandbox Code Playgroud)

判断第一个字段是否为33时,不返回任何内容.这令人困惑.

fed*_*qui 5

通过说

awk '{FS='\t'} $1==5 {print}' file
Run Code Online (Sandbox Code Playgroud)

您错误地定义了字段分隔符.要使它成为制表符,您需要说"\t"(带双引号).进一步阅读:awk没有捕获第一行/分隔符.

此外,您将每行设置它,因此它不会影响第一行.你想用:

awk 'BEGIN{FS='\t'} $1==5' file
Run Code Online (Sandbox Code Playgroud)

是的,但为什么它在一个案例中有效但在另一个案例中却没有?

awk '{FS='\t'} $1==5' file  # it works
awk '{FS='\t'} $1==33' file # it does not work
Run Code Online (Sandbox Code Playgroud)

你正在使用单引号'\t',这意味着你实际上将3个字符串连接在一起'{FS=',\t'} $1==5'产生你的awk命令.shell解释\tas t,所以你的awk脚本实际上是:

awk '{FS=t} $1==5'
Run Code Online (Sandbox Code Playgroud)

该变量t未设置,因此您将字段分隔符设置为空字符串"".这意味着该行被分割为与您拥有的字符一样多的字段.你可以看到它正在做awk 'BEGIN{FS='\t'} {print NF}' file,它将显示每条记录有多少个字段.

然后,$1仅仅是3$2包含第二3.

  • @TomFenech shell将字符`t`粘贴到awk脚本中,awk看到`FS = t`,它不是`FS ="t"`而是一个空变量.我也有同样的困惑. (3认同)