2016-08-09 2 views
-3

나는 Awk에 상당히 익숙하며 다음 쿼리를 가지고있다.Awk에서 여러 if 조건을 사용하는 방법?

I 출력 다음 날을 주어야한다 awk 명령 만들기 위해 노력하고

"11111","TRUE","aa" 
"456789","TRUE","aa;bb;cc" 
"2345","TRUE","bb" 
"434566","","cc" 

input.csv : 나는 것으로 처음 두 개의 인수를 필요

output.csv

"11111","TRUE","aa,," 
"456789","TRUE","aa,bb,cc" 
"2345","TRUE",",bb," 
"434566","",",,cc" 

을 매번 인쇄되지만 세 번째 것은 확인해야합니다. 따라서 세 번째 속성은 aa, bb, cc 또는 이들 중 aa, bb 또는 aa, cc 또는 aa, bb, cc 또는 이들 중 아무 것도 가질 수 있으므로이 중 어느 것이 있는지 확인하고 이러한 구분 된 속성을 인쇄해야합니다. 쉼표로 aa; bb가 입력 파일에 있다면 나는 aa, bb가 필요하다. 그 다음엔 아무 것도 없으면 ,,, (두 개의 쉼표)가 필요하다.

나는 각각 aa, bb, cc가있는 경우 각각의 정규식을 사용하고 있습니다. 존재하지 않는다면 varible 값에 추가되며, 쉼표 만 부가됩니다.

다음 명령을 생성했습니다.

awk 'BEGIN{FS=",";OFS=","} { if($3 ~ /aa/) { value="aa" } else { value="," }; if($3 ~ /bb/) { value="$value,bb" } else { value="$value," }; 
if($3 ~ /cc/) { value="$value,cc" } else { value="$value,"}; print $1 , $2 , $value}' input.csv > output.csv 

하지만 다음과 같은 결과가 표시됩니다.

"11111","TRUE","11111","TRUE","aa" 
"456789","TRUE","456789","TRUE","aa;bb;cc" 
"2345","TRUE","2345","TRUE","bb" 
"434566","","434566","","cc" 

왜 처음 두 속성을 두 번 인쇄 한 다음 세 번째 값을 인쇄 할 지 모르겠습니다. 나는 쉘 스크립트에서 그것을 할 수 있지만 awk를 사용하여 그것을 할 필요가있다.

+2

이 명령에 사용하는 논리는 무엇입니까? –

+0

매번 인쇄 할 첫 번째 두 개의 인수가 필요하지만 세 번째 인수는 확인해야합니다. 그래서 세 번째 속성은 aa, bb, cc 또는 이들의 결합을 aa, bb 또는 aa, cc 또는 aa, bb, cc 또는 이들 중 어느 것도 가질 수 없으므로 이들 중 어느 것이 있는지 확인하고 이들을 인쇄해야합니다 쉼표로 쉼표로, 만약 aa; bb가 입력 파일에 있습니다. 나는 aa, bb가 필요합니다. 아무 것도 없으면, (두 개의 쉼표)가 필요합니다. 그래서 각 체크에 aa, bb, cc가있는 경우 각각의 정규 표현식을 사용하고 있습니다. 존재하지 않는 경우 varble 값에 추가됩니다 (쉼표). 값이 추가됩니다. –

+2

'awk' 기본 안내서를 읽고'print $ n'이 변수'n'의 내용을 인쇄하지 않고 입력 행의 n 번째 필드를 인쇄하기 때문에'awk'에 대해 배우십시오. 따라서 'n'이 정수가 아닌 값 (예 : 영숫자 문자열)이면 정수 값 (예 : 0)으로 변환되고 '$ 0'(전체 입력 행)을 나타냅니다. – Jdamian

답변

1
$ cat tst.awk 
BEGIN { 
    FS=OFS="\"" 
    split("aa,bb,cc",dflts,/,/) 
} 
{ 
    delete vals 
    for (i in dflts) { 
     vals[i] = ($(NF-1) ~ dflts[i] ? dflts[i] : "") 
    } 
    $(NF-1) = vals[1] "," vals[2] "," vals[3] 
    print 
} 

$ awk -f tst.awk file 
"11111","TRUE","aa,," 
"456789","TRUE","aa,bb,cc" 
"2345","TRUE",",bb," 
"434566","",",,cc" 

Arnold Robbins의 Effective Awk Programming, 4th Edition을 읽으십시오.

+0

이 코드의 논리를 잘 이해하고 있지만 3 행과 8 행에 구문 오류가 발생하므로 Solaris를 사용하고 있기 때문에 어쩌면 알아 냈을 것입니다. 표준이 있습니다. awk가 설치되었습니다. 그래서 코드 3 번을 split ("aa, bb, cc", dflts, /, /)에서이 분할 ("aa, bb, cc", dflts, ",")로 변경했습니다. 현재 구문 오류 아래에 있습니다. 8 호선에서 해결할 수 없어요. awk : 8 행 근처에 구문 오류가 있습니다. awk : 8 행 근처에서 불법적 인 진술. –

+0

Solaris에서는 기본 awk가 사용되지 않아서 깨진 awk입니다. 솔라리스에서/usr/xpg4/bin/awk를 사용합니다 (코드를 다시 위의 방법으로 변경하십시오). 솔라리스에서도 기본적으로 작동하지만 POSIX와 호환되는 것은/usr/xpg4/bin/awk보다 적습니다. –

관련 문제