$ 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时,不会返回任何内容。这令人困惑。
答案 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