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

时间:2015-06-24 15:48:16

标签: 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}'

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

2 个答案:

答案 0 :(得分:5)

awk '{FS='\t'} $1==5 {print}' file

您正在错误地定义字段分隔符。要使其成为标签,您需要说"\t"(带双引号)。进一步阅读:awk not capturing first line / separator

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

awk 'BEGIN{FS='\t'} $1==5' file

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

awk '{FS='\t'} $1==5' file  # it works
awk '{FS='\t'} $1==33' file # it does not work

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

awk '{FS=t} $1==5'

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

然后,$1只是3$2包含第二个3

答案 1 :(得分:0)

首先!在你问之前,你能更好地解释一下你真正想做的事吗?看....!

more awk.txt
  12  32  45
  5   2   3
  33  11  33


  awk -F"[ \t]" '$1 == 5 { print $0}' awk.txt
  5   2   3

  awk -F"[ \t]" '$1 == 33 { print $0}' awk.txt
  33  11  33

  awk -F"[ \t]" '$1 == 12 { print $0}' awk.txt
  12  32  45

http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_23.html

FCS