2011-06-13 36 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 - 你能請幫助我在這裏

的printf(「國家標籤|%S |%S \ N」,CITIZEN_COUNTRY_NAME,CITIZENSHIP_CODE)

country_codes.config文件的內容

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

調用從awk的系統,因爲它會在每一行的讀取調用的性能殺手由awk。我只能猜測你想要做什麼,但awk可以同時處理兩個(或更多)文件。你能提供更多細節嗎?示例輸入文件和所需的輸出? – ripat 2011-06-13 07:47:41

+0

我已經有一個nawk塊,它讀取一個文件的20000個記錄,其中一個字段是國家,我想要一個小塊用於ISO代碼查找 - 我想將它放在一個單獨的數組中,然後在nawk塊中使用它每當我得到國家 - 希望這可以幫助 – user549432 2011-06-14 04:28:03

回答

1

系統返回被叫命令的退出值,但命令i的輸出沒有回到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重寫命令 - 請指教 - 謝謝 – user549432 2011-06-13 17:19:39

+1

getline可能會像使用grep一樣慢。搜索每個記錄的查找文件可能是一個壞主意。但awk對於這種事情是有好處的;讀取國家查找一次並構建數組,然後讀取數組中的輸入記錄和輸出數據。 – 2011-06-13 18:22:39

+0

我面臨的一個問題每當有國名(支架) 或單apostrope' 樣本值 CIV @科特迪瓦 COD @剛果民主共和國(扎伊爾是) 你可以請幫我解決這兩個問題。 – user549432 2011-07-18 04:07:09

0

預加載使用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重寫命令 - 請指教 – user549432 2011-06-13 18:04:44

+0

使用此awk代碼,您只需讀取一次260條記錄,並且對於每個20K輸入記錄,您只需進行一次非常快速的數組查找。否則,你對每個輸入記錄執行grep(20,000 grep進程),顯然效率更低。 – 2011-06-13 18:28:23

+0

我試圖通過調用主窗體並使用一些回聲來關閉此nawk塊 - 沒有使用內部使用的系統回聲,你可以在這裏幫助我 - 查看我原始問題中編輯的代碼的詳細信息 – user549432 2011-06-13 20:15:50