在AWK中循环关联数组时打印空行

3

我不清楚为什么在AWK中 day[] 数组的正确值没有被打印,而是打印了空行。

BEGIN{
        day[1]="Sunday"
        day["first"]="Sunday"
        day[2]="Monday"
        day["second"]="Monday"
        day[4]="Wednesday"
        day["fourth"]="Wednesday"
        day[3]="Tuesday"
        day["third"]="Tuesday"
        for (i in day)
        {
            print $i
            print day[$i]
        }
}

显式地打印出单个数组元素,输出如下所示:

 BEGIN{
        day[1]="Sunday"
        day["first"]="Sunday"
        day[2]="Monday"
        day["second"]="Monday"
        day[4]="Wednesday"
        day["fourth"]="Wednesday"
        day[3]="Tuesday"
        day["third"]="Tuesday"
        print day[1]
        print day["first"]
        print day[2]
        print day["second"]
        print day[3]
        print day["third"]
        print day[4]
        print day["fourth"]
}

我正在运行Linux Fedora 5.12.11-300操作系统。

非常感谢,

Mary

3个回答

4

在打印 i 或数组值时,不应使用 $,因为它是指代 awk 语言中的字段值,改用以下方式。此外,您无需使用两次打印语句,也可以在单个带有换行符的打印语句中使用。

awk '
BEGIN{
        day[1]="Sunday"
        day["first"]="Sunday"
        day[2]="Monday"
        day["second"]="Monday"
        day[4]="Wednesday"
        day["fourth"]="Wednesday"
        day[3]="Tuesday"
        day["third"]="Tuesday"
        for (i in day)
        {
           print i ORS day[i]
        }
}'
< p >< em >< strong >改进版的 awk: 如果您需要为相同的值使用两个语句,可以以单一赋值的方式定义它们。即使具有相同值的不同索引,这也应该起作用,这将节省几行代码 :)

awk '
BEGIN{
        day[1]=day["first"]="Sunday"
        day[2]=day["second"]="Monday"
        day[4]=day["fourth"]="Wednesday"
        day[3]=day["third"]="Tuesday"
        for (i in day)
        {
            print i OFS day[i]
        }
}'

1
++用于合并赋值,例如day[1]=day["first"]="Sunday" - anubhava

1
一种更简洁的方法是通过分割输入字符串来实现,例如:
awk -v days='Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday' \
    -v cardinal='First,Second,Third,Fourth,Fifth,Sixth,Seventh' '
BEGIN { 
  split(days,     days_ar,     /,/)
  split(cardinal, cardinal_ar, /,/)
  for (i=1; i<=7; i++) 
    print cardinal_ar[i] " = " days_ar[i]
}' | column -t

输出:

First    =  Monday
Second   =  Tuesday
Third    =  Wednesday
Fourth   =  Thursday
Fifth    =  Friday
Sixth    =  Saturday
Seventh  =  Sunday

1
或者 n = split("第一个星期日 第二个星期一 第三个星期二 第四个星期三",tmp); for (i=1; i<n; i+=2) { day[i] = day[tmp[i]] = tmp[i+1] } - Ed Morton

0
非常感谢所有为回答我的求助做出贡献的人。
我选择了第一个答案,因为我对找出数组值未被打印的原因很感兴趣。RavinderSingh13 正确地指出了原因,即由于在变量 i 前使用了 $ 符号。我错误地将 Awk 视为 shell 脚本。以下是打印数组值而不包括 $ 变量的代码:
awk '
BEGIN{
        day[1]=day["first"]="Sunday"
        day[2]=day["second"]="Monday"
        day[3]=day["third"]="Tuesday"
        day[4]=day["fourth"]="Wednesday"
        for (i in day)
        {
            print i,day[i]
        }
}'

我从Awk脚本中学到的一个有趣的点是,只有BEGIN部分会始终运行,无论是否读取输入文件。另一方面,除非Awk语句至少伴随着一个输入文件,否则body/END/both部分将不会运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接