2014-03-30 7 views
1

nawk 명령에서 함수 호출을 수행하는 방법을 잘 모르겠습니다. 나는 입력과 출력에서 ​​원하는 것을 범위를 주었다. 이 함수는 3 열의 유효성을 검사하고 true 또는 false를 반환해야합니다. 열이 조건을 만족하면 좋은 파일로 이동해야합니다. 나쁜 파일로 가지 않으면. 내 기능을 수행하기 위해 nawk 명령을 수정하는 데 도움을받을 수 있습니까?Nawk 명령에서 함수 호출

길이 확인은 단일 문으로 수행 할 수 있지만 유효성 검사 기능은 샘플 코드에 불과하다는 것을 알고 있습니다. 유효성 검사 함수에서 길이 검사를 더 많이 수행하려고합니다.

input.txt를 :

1 | I | 123 | KK 
3 | U | 3456 | JJ 
6 | B | 241 | YH 

outputgood.txt :

3 | U | 3456 | JJ 

outputbad.txt :

1 | I | 123 | KK 
6 | B | 241 | YH 

스크립트 :

#!/bin/sh 
#function validation 

function validate(){ 
in = $1 
if length(in) > 3 
    return true 
else 
return false 
} 

nawk -F '|' 'function validate($3){print}' input.txt > outputgood.txt 
+0

awk는 쉘 함수를 실제로 호출 할 수 없으며, length (in)는 잘못된 쉘 구문입니다. –

답변

0

첫째로, 당신은 당신이 당신의 awk 스크립트 내에서 호출하려는 쉘 기능을 가지고있다. 그건 안돼.

유효성 검사가 셸에 있어야하는 경우 셸에서 모든 작업을 수행 할 수 있습니다.

#!/bin/sh 

while read line; do 

    var=${line#* | }        # take off first field 
    var=${var#* | }        # take off second field 
    var=${var% | *}        # take off fourth field 
    var=`expr "$var" : "^\ *\(.*[^ ]\)\ *$"`  # trim whitespace 

    if [ ${#var} -gt 3 ]; then 
    echo "$line" >> outputgood.txt 
    else 
    echo "$line" >> outputbad.txt 
    fi 

done < input.txt 

우리는 $IFS 우리가 공백의 변수 양을 사용하지 않기 때문에 매개 변수 도구를 사용하여 선을 분할하고 있습니다. 위치 매개 변수를 사용하여이 작업을 계속 수행 할 수 있으므로 잠재적으로 다른 필드에도 쉽게 액세스 할 수 있습니다. 필드 길이를 조건으로 사용하는 경우 여전히 트리밍해야합니다. 세 번째 필드가 1000보다 큰 여부에 정말 관심이 무엇

#!/bin/sh 

IFS="|" 
while read line; do 

    set -- $line 
    var=`expr "$3" : "^\ *\(.*[^ ]\)\ *$"`  # trim whitespace 

    if [ ${#var} -gt 3 ]; then 
    echo "$line" >> outputgood.txt 
    else 
    echo "$line" >> outputbad.txt 
    fi 

done < input.txt 

는, 그 필드의 길이보다 테스트에 더 좋은 일이 될 것입니다 경우. 프로그래밍의 명확성은 다른 무엇보다도 명확합니다. 당신이 그것을 피할 수 없다면 난독 처리하지 말아라.

bash에 약간 적은 코드로이 작업을 수행 할 수 있지만 질문에 "쉘"만 지정 했으므로 나는 /bin/sh이라고 가정하고있다.

1

읽기 데이터 인 경우 파이프로 분할하면 필드 값에 공백이 남습니다. 또한 nawk 함수는 실제로 nawk 스크립트 본문에 있어야합니다.

은의이를 해보자 :
nawk -F'[[:space:]]*\\\|[[:space:]]*' ' 
    function validate(in) { 
     return (length(in) > 3) 
    } 
    { 
     if (validate($3)) { 
      print > "good" 
     } else { 
      print > "bad" 
     } 
    } 
' input.txt 

훨씬 간단

은 다음과 같습니다

nawk -F '|' '{if ($3 > 1000) print > "good"; else print > "bad"}' input.txt 
+0

나는 nwak 명령 밖에서 유효성 검사 기능을 유지하고 teh 이유는 25 줄 기존 코드에서 유효성 검사 기능입니다. 난 validate.I를 얻을 수있는 유일한 함수 호출을 가지고 nwak 명령이 필요합니다 pls 도움이 필요해 그거? – Senthil

+0

awk에서 bash 함수를 호출하는 것은 어색하고 느립니다. 왜 언어를 이렇게 혼합하고 있습니까? –

+0

bash 또는 ksh를 사용할 수 있습니까? 아니면/bin/sh로 제한되어 있습니까? –