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
$

这利用了 p1p2 被初始化为相同值的事实,并且 p1p2 在增量部分都是非零的循环。

保持简单。有多种可能的解决方案,具体取决于您真正想要什么以及 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