awk不会打印简单字段

时间:2019-07-02 10:17:44

标签: awk

这是一个awk脚本

> # cat zzz.awk
FS=" "
/fruit/ { fr = $2; print $fr; }

应用于此数据文件

> # cat data.dat

fruit apple 1 3
fruit mango 4 9
vegetable tomato 6 5
fruit orange 9 8
vegetable potato 1 4

,产生以下输出:

> # awk   -f zzz.awk   data.dat

fruit apple 1 3
fruit apple 1 3
fruit mango 4 9
fruit mango 4 9
vegetable tomato 6 5
fruit orange 9 8
fruit orange 9 8
vegetable potato 1 4

为什么它不会产生此预期输出

apple
mango
orange

,以及如何更正脚本?

(即使首选便携式解决方案,当前版本也是GNU Awk 3.1.7。)

谢谢。

3 个答案:

答案 0 :(得分:1)

所有awk脚本均由具有相同结构的部分组成:

PATTERN { CODE }

您没有。首先使用特殊模式BEGIN来完成您想做的事情。此外,awk中的变量不一定具有$字形。 $2$2,但是fr只是fr

BEGIN { FS=" " }
/fruit/ { fr = $2; print fr; }

当然,您可以这样做:

awk -F' ' '$1=="fruit"{print $2}' data.dat

答案 1 :(得分:1)

好吧,awk完全是错误的。例如,FS不能这样设置,它将输出每条记录:

$ awk 'FS=" "' file
fruit apple 1 3
fruit mango 4 9
vegetable tomato 6 5
fruit orange 9 8
vegetable potato 1 4

使用:

$ awk 'BEGIN{FS=" "}' file

接下来,您不会在awk中将变量引用为$fr(除非您要这样做)。计算结果为$0,然后打印整个记录,该记录说明了输出中的重复记录。因此,总结一下:

$ awk '
BEGIN { FS=" " } 
$1 == "fruit" { fr=$2; print fr }' file
apple
mango
orange

(或仅awk '/^fruit/{print $2}'文件)

答案 2 :(得分:1)

有了这个小的awk代码,您可以像这样内联使用它:

awk -F" " '/fruit/ {print $2}' data.dat
apple
mango
orange

但是您不需要将字段分隔符设置为空格,只需将其保留即可。 (注意,然后将包含标签)

awk '/fruit/ {print $2}' data.dat
apple
mango
orange