这是一个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。)
谢谢。
答案 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