2016-06-25 11 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

나는이 질문을 이해하지 못했습니다. Asorti에 대한 호출은 분류 작업을 수행하기에 충분합니다. 루프는 내용을 표시하거나 사용하는 것입니다. 두 배열을 함께 사용하려면 하나의 인덱스 (느슨한 p2) 만 사용하고 하나의 인덱스가 다른 인덱스보다 작을 수 있으므로주의하십시오. –

+0

@callmeSteve 그래서'for' 루프는 어떻게 작성 될까요? 나는 'asorti'와 'asorti'둘 다에 대해 동일한 진실을 사용해야 만 할 것인가? 예. 'n = asorti (pacben, pacsor) n = asorti (pacben2, pacsor2) (p = 1; p <= n; p ++)' – 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은 쉼표 연산자를 허용하지 않습니다.

맥 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

예, @ Edmonton; 두 개의 루프 컨트롤 카를 쓸 필요가 없습니다. 루프 루프의 인덱스를 개별적으로 처리 (증가 또는 감소하므로 별도로 조정)하는 실제 루프의 본문에 뭔가가 있다고 가정합니다. –

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