AWK 3.1.7 - 单个 for 中的多个循环
AWK 3.1.7 - multiple loops in a single for
我正在尝试使用以下代码对 2 个数组进行排序:
n = asorti (pacben,pacsor)
m = asorti (pacben2,pacsor2)
我需要对它们进行排序,最好放在一起。我知道我可以分别执行以下操作:
n = asorti (pacben,pacsor)
for (p = 1;p <= n; p++) {
blah
}
m = asorti (pacben2,pacsor2)
for (p2 =1;p2 <= m; p2++) {
blah
}
但是当我尝试以下操作时:
n = asorti (pacben,pacsor)
m = asorti (pacben2,pacsor2)
for (p = 1;p <= n;p++ && p2 = 1;p2 <= m;p2++) {
blah
}
我收到以下错误:
awk: cmd. line:25: for (p = 1;p <= n;p++ && p2 = 1;p2 <= m; p2++) {
awk: cmd. line:25: ^ syntax error
awk: cmd. line:25: for (p = 1;p <= n;p++ && p2 = 1;p2 <= m; p2++) {
awk: cmd. line:25: ^ syntax error
我们将不胜感激。
在 C 中,您需要修改:
for (p = 1;p <= n;p++ && p2 = 1;p2 <= m;p2++) {
进入:
for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) {
这是逗号运算符的标准用法之一。但是,awk
似乎不接受逗号运算符。
Mac OS X (BSD) awk
:
$ awk -v n=2 -v m=3 'BEGIN { for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) print p1, p2}'
awk: syntax error at source line 1
context is
BEGIN { for (p = >>> 1, <<<
awk: illegal statement at source line 1
awk: illegal statement at source line 1
$
GNU awk
:
$ awk -v n=2 -v m=3 'BEGIN { for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) print p1, p2}'
awk: cmd. line:1: BEGIN { for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) print p1, p2}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: BEGIN { for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) print p1, p2}
awk: cmd. line:1: ^ syntax error
$
awk
的 POSIX 规范在运算符列表中不包含逗号运算符。
您可以使用:
$ awk -v n=2 -v m=3 'BEGIN { for (p1 = p2 = 1; p1 <= n && p2 <= m; p1++ && p2++) print p1, p2}'
1 1
2 2
$
这利用了 p1
和 p2
被初始化为相同值的事实,并且 p1
和 p2
在增量部分都是非零的循环。
保持简单。有多种可能的解决方案,具体取决于您真正想要什么以及 blah
可能做什么,但基于您接受 ,这一定是您想要的:
n = asorti (pacben,pacsor)
m = asorti (pacben2,pacsor2)
for (p = 1;p <= n && p <=m; p++) {
blah
}
还要考虑如何处理不同大小的数组:
$ cat tst.awk
BEGIN{
n = split("A C E",a)
m = split("B D F G H",b)
for (p=1;p<=n && p<=m;p++) {
print a[p] ORS b[p]
}
for (;p <= (n > m ? n : m);p++) {
print (n > m ? a[p] : b[p])
}
}
$ awk -f tst.awk
A
B
C
D
E
F
G
H
我正在尝试使用以下代码对 2 个数组进行排序:
n = asorti (pacben,pacsor)
m = asorti (pacben2,pacsor2)
我需要对它们进行排序,最好放在一起。我知道我可以分别执行以下操作:
n = asorti (pacben,pacsor)
for (p = 1;p <= n; p++) {
blah
}
m = asorti (pacben2,pacsor2)
for (p2 =1;p2 <= m; p2++) {
blah
}
但是当我尝试以下操作时:
n = asorti (pacben,pacsor)
m = asorti (pacben2,pacsor2)
for (p = 1;p <= n;p++ && p2 = 1;p2 <= m;p2++) {
blah
}
我收到以下错误:
awk: cmd. line:25: for (p = 1;p <= n;p++ && p2 = 1;p2 <= m; p2++) {
awk: cmd. line:25: ^ syntax error
awk: cmd. line:25: for (p = 1;p <= n;p++ && p2 = 1;p2 <= m; p2++) {
awk: cmd. line:25: ^ syntax error
我们将不胜感激。
在 C 中,您需要修改:
for (p = 1;p <= n;p++ && p2 = 1;p2 <= m;p2++) {
进入:
for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) {
这是逗号运算符的标准用法之一。但是,awk
似乎不接受逗号运算符。
Mac OS X (BSD) awk
:
$ awk -v n=2 -v m=3 'BEGIN { for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) print p1, p2}'
awk: syntax error at source line 1
context is
BEGIN { for (p = >>> 1, <<<
awk: illegal statement at source line 1
awk: illegal statement at source line 1
$
GNU awk
:
$ awk -v n=2 -v m=3 'BEGIN { for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) print p1, p2}'
awk: cmd. line:1: BEGIN { for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) print p1, p2}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: BEGIN { for (p = 1, p2 = 1; p <= n && p2 <= m; p1++, p2++) print p1, p2}
awk: cmd. line:1: ^ syntax error
$
awk
的 POSIX 规范在运算符列表中不包含逗号运算符。
您可以使用:
$ awk -v n=2 -v m=3 'BEGIN { for (p1 = p2 = 1; p1 <= n && p2 <= m; p1++ && p2++) print p1, p2}'
1 1
2 2
$
这利用了 p1
和 p2
被初始化为相同值的事实,并且 p1
和 p2
在增量部分都是非零的循环。
保持简单。有多种可能的解决方案,具体取决于您真正想要什么以及 blah
可能做什么,但基于您接受
n = asorti (pacben,pacsor)
m = asorti (pacben2,pacsor2)
for (p = 1;p <= n && p <=m; p++) {
blah
}
还要考虑如何处理不同大小的数组:
$ cat tst.awk
BEGIN{
n = split("A C E",a)
m = split("B D F G H",b)
for (p=1;p<=n && p<=m;p++) {
print a[p] ORS b[p]
}
for (;p <= (n > m ? n : m);p++) {
print (n > m ? a[p] : b[p])
}
}
$ awk -f tst.awk
A
B
C
D
E
F
G
H