unix中的awk命令

unix中的awk命令,awk,Awk,为什么while循环在下面的脚本中只运行一次 #!/bin/ksh awk ' {site=$1; print $2; while (getline <"portison.result") { var=substr($2, 0, 3) if (site == var) print $0 } } ' sites.cfg sites.cfg包含: 0 AGAMS3 EDGE NTS 2347629

为什么while循环在下面的脚本中只运行一次

#!/bin/ksh
awk '
{site=$1; print $2;
    while (getline <"portison.result")
    {
      var=substr($2, 0, 3)
      if (site == var)
          print $0
    }
}
' sites.cfg
sites.cfg
包含:

0       AGAMS3  EDGE    NTS     2347629,,,RHe

10      AGNSD9  EDGE    NTS     2340447,,,TRf

100     AGBSN0  EDGE    NTS     2323735,,,BRc

2       AGUMS3  EDGE    NTS     2347629,,,RHe

20      AGWSD9  EDGE    NTS     2340447,,,TRf

200     AGLSN0  EDGE    NTS     2323735,,,BRc

3       AGDMS3  EDGE    NTS     2347629,,,RHe

30      AGSSD9  EDGE    NTS     2340447,,,TRf

300     AGESN0  EDGE    NTS     2323735,,,BRc

4       AGNSD9  EDGE    NTS     2340447,,,TRf

40      AGAMS3  EDGE    NTS     2347629,,,RHe

400     AGCSN0  EDGE    NTS     2323735,,,BRc

5       AGISN0  EDGE    NTS     2323735,,,BRc

500     AGISN0  EDGE    NTS     2323735,,,BRc
AGA     Glasgow                       AQ

AGN     Newport                      TR

AGB     Bridgend                      BR

AGU     Sunderland                   RH

AGW     Swansea                       SW

AGL     Marine Wharf               MW

AGD     Dudley                          DU

AGS     Brighton                       SU

AGE     Southend                      ES

AGC     Solent                          CH

AGI     Isle of Man                  IM and PB
我希望输出为:

Glasgow
0 AGAMS3 EDGE NTS 2347629,,,RHe
40 AGAMS3 EDGE NTS 2347629,,,RHe

Newport
10 AGNSD9 EDGE NTS 2340447,,,TRf
4 AGNSD9 EDGE NTS 2340447,,,TRf

Bridgend
100 AGBSN0 EDGE NTS 2323735,,,BRc

Sunderland
2 AGUMS3 EDGE NTS 2347629,,,RHe

Swansea
20 AGWSD9 EDGE NTS 2340447,,,TRf

Marine
200 AGLSN0 EDGE NTS 2323735,,,BRc

Dudley
3 AGDMS3 EDGE NTS 2347629,,,RHe

Brighton
30 AGSSD9 EDGE NTS 2340447,,,TRf

Southend
300 AGESN0 EDGE NTS 2323735,,,BRc

Solent
400 AGCSN0 EDGE NTS 2323735,,,BRc

Isle
5 AGISN0 EDGE NTS 2323735,,,BRc
500 AGISN0 EDGE NTS 2323735,,,BRc

你的热线应该是

而((getline<“portison.result”)>0)

否则,while比较是不明确的,不会使用getline的结果


正如@marco所指出的,您需要在while循环之后使用
close(“portison.result”)
关闭文件

而((getline<“portison.result”)>0)

否则,while比较是不明确的,不会使用getline的结果

正如@marco所指出的,在while循环之后,您需要使用
close(“portison.result”)
关闭文件,您必须关闭“portison.result”,以便强制awk在下一个读取周期中再次打开它;此外,您需要避免空行:

awk '
    !/^$/{
        site=$1; 
        printf $2;

        while (getline <"portison.result") {
            var=substr($2, 0, 3)
            if (site == var)
                printf " " $0
        }
        print "";
        close("portison.result");
    }' sites.cfg
awk'
!/^$/{
地点=$1;
印刷费2美元;
while(getline您必须关闭“portison.result”以强制awk在下一个读取周期中再次打开它;此外,您需要避免空行:

awk '
    !/^$/{
        site=$1; 
        printf $2;

        while (getline <"portison.result") {
            var=substr($2, 0, 3)
            if (site == var)
                printf " " $0
        }
        print "";
        close("portison.result");
    }' sites.cfg
awk'
!/^$/{
地点=$1;
印刷费2美元;

虽然(getline取决于文件的大小以及输出的顺序是否重要,但您可能会发现这比在一个文件中的每一行上对另一个文件中的每一行进行迭代要快得多:

#!/usr/bin/awk -f
NR==FNR {
    sites[$1] = $2
    indices[c++] = $1
    next
}
{
    idx = substr($2, 0, 3)
    lines[idx] = lines[idx] "\n" $0
}
END {
    for (i=0;i<=c;i++) print sites[indices[i]] lines[indices[i]]
}

根据文件的大小以及输出顺序是否重要,您可能会发现这比在一个文件中的每一行上对另一个文件中的每一行进行迭代要快得多:

#!/usr/bin/awk -f
NR==FNR {
    sites[$1] = $2
    indices[c++] = $1
    next
}
{
    idx = substr($2, 0, 3)
    lines[idx] = lines[idx] "\n" $0
}
END {
    for (i=0;i<=c;i++) print sites[indices[i]] lines[indices[i]]
}

好吧,也许portison.result只包含一行?请提供一个运行的示例,以及所需的任何测试数据(如果可能,生成一个最小的测试用例)。否则,您不太可能获得帮助。欢迎使用堆栈溢出。我已为您设置了问题格式。您可能会发现FAQ对阅读非常有用。好的,也许portison.result只包含一行?请提供一个运行示例,以及所需的任何测试数据(如果可能,生成一个最小的测试用例)。否则,您不太可能获得帮助。欢迎使用堆栈溢出。我已为您设置了问题格式。您可能会发现常见问题解答在阅读时很有用。我的输出与:我的输出与:有关如何说“谢谢”的更多信息,请参阅常见问题解答:有关如何说“谢谢”的更多信息,请参阅常见问题解答: