2016-06-25 1 views
1

ための単一で複数のループ私は次のコードで2つの配列をソートするためにしようとしています:AWK 3.1.7 -

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 

任意およびすべてのヘルプ感謝されます。

+0

私はその質問を理解していません。アスコルティへの呼び出しはソートを行うのに十分です。ループはコンテンツを表示または使用することです。両方の配列を一緒に使いたい場合は、1つのインデックス(緩いp2)だけを使用し、1つのインデックスが他のインデックスよりも小さくなるように注意してください。 –

+0

@callmeSteveだから 'for'ループはどのように書かれますか?私は両方のasortiのために同じveriableを使用する必要がありますか?例えば。 (p = 1; p <= n; p ++)のための 'n = asorti(pacben、pacsor)n = asorti(pacben2、pacsor2)' – glly

答えて

2

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の両方がゼロでないループの増分部分であること。

+0

魅力のように働く素晴らしい感謝。あなたは 'for'ステートメントでそれを実行できるとは考えていませんでした。 – glly

+0

ハングオン - はるかに単純な 'for(p = 1; p <= n && p <= m; p ++)print p、p'と同じように、最後のループを書くことは決してありません。 http://stackoverflow.com/a/38038530/1745001を参照してください。 –

+0

はい、@エドモートン。 2つのループコントロールカーが書かれている必要はありません。ループのインデックスを別々に処理する(増分または減分するように調整する)実際のループの本体に何かがあると仮定しています。 –

3

簡単にしてください。

n = asorti (pacben,pacsor) 
m = asorti (pacben2,pacsor2) 
for (p = 1;p <= n && p <=m; p++) { 
    blah 
} 

をだけでなく、異なるサイズの配列を処理する方法を考えてみます:それはあなたが本当に欲しいとは何かblahはしかし、これはあなたが望むものでなければならないあなたが@JonathanLeffer's answerを受け入れるに基づいてないかもしれません何に依存して、種々の可能な解決策があります

は、
$ 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 
+1

ああ、知ってうれしいです。 – glly