unix中的awk命令
为什么while循环在下面的脚本中只运行一次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
#!/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只包含一行?请提供一个运行示例,以及所需的任何测试数据(如果可能,生成一个最小的测试用例)。否则,您不太可能获得帮助。欢迎使用堆栈溢出。我已为您设置了问题格式。您可能会发现常见问题解答在阅读时很有用。我的输出与:我的输出与:有关如何说“谢谢”的更多信息,请参阅常见问题解答:有关如何说“谢谢”的更多信息,请参阅常见问题解答: