2011-06-14 102 views
0

這是我在我的系統中運行的確切代碼sh lookup.sh。我在nawk塊中看不到任何詳細信息,或者將其寫入文件abc.txt。只打印I am here 0I am here 1。即使nawk中的printf不起作用。請幫忙。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

你想完成什麼? – 2011-06-14 04:00:49

+0

請提供示例'/ tmp/abs.txt'文件以及必需的輸出。這肯定有一個簡單的awk解決方案。 – ripat 2011-06-14 07:20:52

回答

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

這樣做的工作 - 我想有數組填充在awk中使用outid ethis awk(實際上在另一個nawk讀取20,000個記錄在一個文件中,其值爲INDIA作爲其中一個屬性 - 我很抱歉,我不能讓你知道文件的完整佈局 - 簡而言之,過程體應該有上面提到的awk塊,並且已經填充了數組與國家名稱和ISO值,我會用我的實際nawk這個數組替代國家ISO的國家名稱 - 謝謝 – user549432 2011-06-14 15:19:42

+0

@ user548432:在你的'awk'手冊中查找'getline'。至少在'gawk'(GNU Awk)中,你可以使用BEGIN塊中的'getline來預加載你的數組。如果你的版本不能通過某種機制來實現,那麼考慮升級到GNU Awk或者改用Perl或Python來完成這項工作。你不能讓一個awk腳本填充另一個awk腳本。或者,您也許可以使用FILENAME變量來檢測何時讀取配置文件以及何時讀取其他內容,然後在命令行中指定配置文件和其他數據文件。 – 2011-06-14 17:07:18

0

我不知道你想完成什麼,但讓我猜:如果國家是印度,然後打印輸出如下:

如果是這樣,下面的代碼將實現該目標:

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

-F @標誌告訴awk(或nawk)使用@作爲字段分隔符。

+0

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

+0

@ user549432你可以提供兩個文件的樣本以及所需的輸出。沒有這個,我們只能猜測你在做什麼。 – ripat 2011-06-14 10:12:11

+0

@ Ripat - 喬納森在上面發佈的代碼完成了這項工作 - 對於你的問題 - 我希望在awk中使用國家名稱和ISO填充數組,以便在awk之外使用(實際上在另一個nawk中,它可以讀取文件中的20,000條記錄,它有一個值INDIA作爲屬性之一 - 我很抱歉,我不能讓你知道文件的完整佈局 - 簡而言之,過程體應該具有上面提到的awk塊,並使用國家名和ISO值填充數組我將在我的實際nawk中使用這個數組來代替國家ISO的國家名稱 - 謝謝 – user549432 2011-06-14 15:28:06

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 2011-06-14 16:54:50

+0

我把getline構建了BEGIN {}塊中的關聯數組。在處理所有輸入之前,BEGIN {}塊只運行一次。所以它只會構建一次關聯數組。 – 2011-06-14 19:07:08

+0

@ Praveen什麼是Country_code [$ 4] - 在開始區塊後,假設我在COUNTRY_NAME字段中獲得值India - 我可以在Country_code數組列表中執行COUNTRY_NAME之類的操作嗎? – user549432 2011-06-15 01:44:16