2011-06-14 5 views
0

이것은 시스템에서 sh lookup.sh으로 실행하고있는 정확한 코드입니다. nawk 블록 내 세부 정보가 표시되지 않거나 abc.txt 파일에 인쇄되거나 작성되었습니다. I am here 0I am here 1 만 인쇄됩니다. printf (nawk)도 작동하지 않습니다. 도와주세요.Unix Awk 배열이 값을 인쇄하지 않습니다.

processbody() { 
nawk ' 
NR == FNR { 
split($0, x, "@") 
country_code[x[2]] = x[1] 
next 
system(" echo " I am here ">>/tmp/abc.txt") 
} 
{ 
CITIZEN_COUNTRY_NAME = "INDIA" 
system(" echo " I am here 1">>/tmp/abc.txt") 
if (CITIZEN_COUNTRY_NAME in country_code) { 
value = country_code[CITIZEN_COUNTRY_NAME] 
system(" echo " I am here 2">>/tmp/abc.txt") 
} else { 
value = "null" 
system(" echo " I am here 3">>/tmp/abc.txt") 
} 
system(" echo " I am here 4">>/tmp/abc.txt") 
print "found " value " for country name " CITIZEN_COUNTRY_NAME >> "/tmp/standalone.txt" 
} ' /tmp/country_codes.config 
echo "I am here 5" >> /tmp/abc.txt 
} 

# Main program starts here 
echo "I am here 0" >> /tmp/abc.txt 
processbody 

그리고 내 country_codes.config 파일 :

$ cat country_codes.config 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
+0

무엇을하고 싶습니까? –

+0

'/ tmp/abs.txt' 샘플을 필요한 출력과 함께 제공하십시오. 분명히 이것을위한 간단한 awk 해결책이 있습니다. – ripat

답변

1

꽤 재미있는 코드입니다. awk 코드입니다. 문제는 첫 번째 조건 인 NR == FNR이 첫 번째 파일 인 country_codes.config 파일에서 읽은 각 레코드에 대해 활성화되어 있지만 처리 작업에 next이 포함되어 있으므로 레코드를 읽고 분할하여 저장하면 문제가됩니다. awk 스크립트의 두 번째 블록을 실행하지 않고 다음 레코드를 읽습니다. 결국에는 완료됩니다. 더 이상 할 일이 없으므로 아무 것도 인쇄하지 않습니다.

이 올바로 수행 작동합니다

processbody() 
{ 
    awk ' 
     { 
     split($0, x, "@") 
     country_code[x[2]] = x[1] 
     #next 
     } 
    END { 
     CITIZEN_COUNTRY_NAME = "INDIA" 
     if (CITIZEN_COUNTRY_NAME in country_code) { 
      value = country_code[CITIZEN_COUNTRY_NAME] 
     } else { 
      value = "null" 
     } 
     print "found " value " for country name " CITIZEN_COUNTRY_NAME 
    } ' /tmp/country_codes.config 
} 

# Main program starts here 
processbody 

그것은 출력이 생성

Hai Vu으로 메모를, 인생 단순화하기 위해 awk의 고유 레코드 분할 시설을 사용할 수 있습니다 :

processbody() 
{ 
    awk [email protected] ' 
    { country_code[$2] = $1 } 
    END { 
     CITIZEN_COUNTRY_NAME = "INDIA" 
     if (CITIZEN_COUNTRY_NAME in country_code) { 
      value = country_code[CITIZEN_COUNTRY_NAME] 
     } else { 
      value = "null" 
     } 
     print "found " value " for country name " CITIZEN_COUNTRY_NAME 
    } ' /tmp/country_codes.config 
} 

# Main program starts here 
processbody 
+0

이것은 일을 않습니다 - 배열 outisid ethis awk (실제로 읽는 다른 nawk 사용할 awk 채워야합니다. 20,000 개의 레코드가 하나의 속성으로 값이있는 속성 - 파일의 전체 레이아웃을 알 수 없다는 것을 유감스럽게 생각합니다 - 짧은 processbody에서 위에 언급 한 awk 블록을 가져야하고 배열이 채워져 있어야합니다 국가 이름과 ISO 값을 가지고 있고, 실제 배열에서이 배열을 사용하여 국가 이름을 국가 ISO로 대체 할 것입니다. 감사합니다. – user549432

+0

@ user548432 : awk 매뉴얼에서'getline'을 찾으십시오. 적어도'gawk' (GNU Awk)에서는 BEGIN 블록에서'getline

0

난 당신이 달성하기 위해 원하는 것을 알고 있지만, 내가 생각하지 않습니다

: 국가는 인도의 경우, 다음 출력을 인쇄

이 경우 다음 코드가 목표를 달성합니다.

awk [email protected] '/INDIA/ {print "found " $1 " for country name " $2 }' /tmp/country_codes.config 

-F @ 플래그는 awk (또는 nawk)에게 @를 필드 구분자로 사용하도록 지시합니다.

+0

필드 중 하나가 국가 인 20000 레코드가있는 파일을 읽는 nawk 블록이 있고 ISO 코드 조회를위한 작은 블록을 원합니다 - 별도의 배열로 가져온 다음 nawk 블록에서 사용하려고 생각했습니다. 내가 나라를 얻을 때마다 - 희망이 도움이 – user549432

+0

@ user549432 당신은 두 파일의 샘플뿐만 아니라 필요한 출력을 제공 할 수 있습니까? 그것없이 우리는 당신이 무엇을 추측 할 수 있습니다. – ripat

+0

@ Ripat - Jonathan이 위에 게시 한 코드 - 귀하의 질문에 -이 awk 외부에서 사용될 배열을 국가 이름과 ISO로 채우고 싶습니다. (실제로 다른 nawk에서 파일에서 20,000 개의 레코드를 읽고 속성 중 하나 인 값 INDIA가있는 파일 - 파일의 전체 레이아웃을 알려주지 못해 죄송합니다. - 짧은 processbody에서 위에서 언급 한 awk 블록을 가져야하고 배열에 국가 이름과 ISO 값이 채워져 있어야합니다. 내가 실제 nawk에서 국가의 이름을 국가 ISO로 대체하기 위해이 어레이를 사용할 것입니다. 감사합니다. – user549432

0

@ user549432 하나의 awk를 원한다고 생각합니다. 스크립트는 먼저 국가 코드 파일을 읽고 연관 배열을 작성한 다음 입력 파일 (@로 구분하지 않음)을 읽고 대체합니까?

그렇다면, 이제 그 /tmp/country_codes.config를 가정하자가있다 :

[email protected] 
[email protected] 
[email protected] 
[email protected] 

및/tmp를/INPUT_FILE (안 @ 구분)이 있습니다

I am from INDIA 
I am from INDIB 
I am from CANADA 

을 그리고, 우리가 할 수있는 이 같은 nawk 스크립트 :

nawk ' 

BEGIN { 
     while (getline < "/tmp/country_codes.config") 
     { 
      split($0,x,"@") 
      country_code[x[2]] = x[1] 
     } 
     } 

    { print $1,$2,$3,country_code[$4]} 

' /tmp/input_file 

가 출력 될 것입니다 :

I am from IND 
I am from IND 
I am from CAN 
+0

네가 명시한 요구 사항이 옳다. 시간 내 주셔서 고마워요. 위 코드의 문제는 배열이 nawk 블록 안에 빌드 된 것입니다.이 pice는 입력 파일의 모든 레코드에 대해 실행될 것이고 getline/grep은 느려질 것입니다. 입력 파일의 20 K 레코드마다 처리해야합니다. 이미 getline을 사용하는 해결책이 있습니다. 기존의 nawk 외부에서이 연관 배열을 원합니다. 배열을 만든 다음 배열을 사용하여 내 배열을 사용하여 내 국가를 조회합니다. nawk 블록 – user549432

+0

BEGIN {} 블록 안에 연관 배열을 만드는 getline을 넣었습니다. BEGIN {} 블록은 모든 입력이 처리되기 전에 한 번 실행됩니다. 따라서 연관 배열을 한 번만 빌드합니다. –

+0

@ Praveen Country_code [$ 4] - 시작 블록이 어떻게 든 가정하면 COUNTRY_NAME 필드에서 India라는 값을 얻습니다. - Country_code 배열 목록에서 COUNTRY_NAME과 같은 것을 할 수 있습니까? – user549432

관련 문제