2010-02-05 46 views
2

這讓我瘋狂。我想要做的就是從awk傳遞一個命令到終端,命令是一個由其他變量連接在一起的字符串。如何在AWK中使用getline和連接在一起的命令

awk的文檔說像

"echo" $1 | getline var 

應該把$ 1的值成變種。但這種情況並非如此。我在這裏錯過了什麼?

我要補充一點,我其實有一個inputfile中循環

for (i = 1; i <=NF ; i=i+1) 
{ 
    "echo" $i | getline var 
    printf var " " 
} 

printf "\n" 

0 2 
1 2 

輸出

0 0 
0 0 

什麼是地獄。

回答

5

那麼,事實證明它不是一個錯誤。

怎麼回事時,則對getline打開一個新的文件,並根據您的系統設置,你只能有每個程序打開X文件。一旦你最大限度地打開文件,getline不能打開任何新的文件。解決的辦法是你必須調用

for (i = 1; i <=NF ; i=i+1) 
{ 
    command="echo" $i 
    command | getline var 
    close(command) 
    printf var " " 

} 

printf "\n" 

當然這是一個微妙的點,並且應該有這個文檔中巨大警示標誌!無論如何,我很高興我解決了它。

2

我發現你的示例有兩個問題。你的「回聲」應該是「回聲」(至少,對我來說「回聲」不起作用),你的printf缺少格式arg。

for (i = 1; i <=NF ; i=i+1) { 
    "echo " $i | getline var; 
    printf "%s ", var ; 
} 
+0

格式字符串是可選的。 – 2010-02-05 20:38:25

+0

這似乎不是問題,這似乎是awk中的一個真正的bug,如果我使用你的代碼,我也會得到棘手的輸出 – ldog 2010-02-05 20:48:00

0

,如果你想連接值

var=$(awk 'BEGIN{cmd="command "} 
{ 
    for (i=1;i<=NF;i++){ 
    cmd = cmd" "$i 
    } 
} 
END { 
    # pass to shell 
    print cmd 
}' file) 

$var