2011-06-13 4 views
0

변수에 할당 된 grep (nawk에서 system()에 사용됨)의 출력에 문제가 있습니다.awk 시스템이 변수를 올바르게 설정하지 않음

nawk '{ 
CITIZEN_COUNTRY_NAME = "INDIA" 
CITIZENSHIP_CODE=system("grep "CITIZEN_COUNTRY_NAME " /tmp/OFAC/country_codes.config | cut -d @ -f1") 
}'/tmp/***** 

값 IND는 콘솔에 표시됩니다하지만 난이의 printf를 줄 때 citizenshipcode의 값은 0입니다 - 당신이 PLS

의 printf 여기 좀 도와 줄래 ("나라 태그 | %의 | %의 \ N ", CITIZEN_COUNTRY_NAME, CITIZENSHIP_CODE) 시스템이 호출 된 명령의 종료 값을 반환

[email protected] 
[email protected] 
[email protected] 
+0

그것이 모든 라인 읽기에 호출됩니다로 성능 살인자입니다 awk. 나는 당신이하려고하는 것만 추측 할 수 있지만 awk는 반드시 두 개 (또는 그 이상)의 파일을 동시에 처리 할 수 ​​있습니다. 더 자세한 정보를 제공 할 수 있습니까? 샘플 입력 파일 및 원하는 출력? – ripat

+0

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

답변

1

country_codes.config 파일의

내용,하지만 명령의 출력 전 awk (또는 nawk)로 반환되지 않습니다. 출력을 얻으려면 getline을 직접 사용하고 싶습니다. 예를 들어, 스크립트를 다시 작성할 수 있습니다

 
awk ' { 
file = "/tmp/OFAC/country_codes.config"; 
CITIZEN_COUNTRY_NAME = "INDIA"; 
FS = "@"; 
while(getline < file) { 
    if($0 ~ CITIZEN_COUNTRY_NAME) { 
     CITIZENSHIP_CODE = $1; 
    } 
} 
close(file); 
}' 
+0

도와 줘서 고마워. 이것은 정확히 내가 찾고있는 것이고 완벽하게 작동합니다. 정말 감사합니다. - 이것에 대해 하나 더 질문이 있습니다. 나는 한 가지 더 질문한다. 국가 조회 파일은 대략 260 개의 레코드를 가지며 20,000 개의 입력 레코드가있을 것이다. 따라서 20 개의 K 레코드에 대해 260 개의 라인이 읽혀질 것이다. 이것은 괜찮을 것인가 아니면 grep을 사용하여 재 작성 할 수 있는가? 명령 - pls 조언 - 감사 – user549432

+1

getline은 아마 grep을 사용하는 것만 큼 느릴 것입니다. 조회 파일을 통해 각 레코드를 검색하는 것은 나쁜 생각 일 수 있습니다. 그러나 awk는 이런 종류의 일에 좋습니다. 국가 조회를 한 번 읽고 배열을 만든 다음 배열에서 입력 레코드와 출력 데이터를 읽습니다. 상기 국가 이름 (브래킷) 또는 단일 apostrope ' 샘플 값이있을 때마다 –

+0

나는 문제에 직면 콩고 @ 코트 디부 아르 COD @ CIV, 민주 공화국은의 (했다 자이르) 을 수행 할 수 있습니다 pls이 두 가지 문제를 극복 할 수 있습니다. – user549432

0

사전로드 AWK와 설정 파일 : AWK에서 시스템을 호출

nawk ' 
    NR == FNR { 
    split($0, x, "@") 
    country_code[x[2]] = x[1] 
    next 
    } 
    { 
    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 
    } 
' country_codes.config filename 
+0

도움을 많이 주셔서 감사합니다. 이것은 정확히 내가 찾고있는 것이고 완벽하게 작동합니다. 정말 감사합니다. - 이것에 대해 하나 더 질문이 있습니다. 나는 한 가지 더 질문한다. 국가 조회 파일은 대략 260 개의 레코드를 가지며 20,000 개의 입력 레코드가있을 것이다. 따라서 20 개의 K 레코드에 대해 260 개의 라인이 읽혀질 것이다. 이것은 괜찮을 것인가 아니면 grep을 사용하여 재 작성 할 수 있는가? 명령 - Pls advice – user549432

+0

이 awk 코드를 사용하면 260 레코드를 한 번 읽고 20KB 입력 레코드 각각에 대해 매우 빠른 배열 조회 만 수행합니다. 그렇지 않으면, 모든 입력 레코드 (20,000 grep 프로세스)에 대해 grep을 수행하며, 효율성이 훨씬 떨어집니다. –

+0

양식을 메인 호출하고 일부 에코를 사용하여이 nawk 블록을 에스크레이트 해 보았습니다. - 시스템 에코를 사용하지 않았으므로 pls가 나를 도와 줄 수 있습니까? - 원래의 질문에 편집 된 코드에 대한 자세한 내용을 참조하십시오. – user549432

관련 문제