2017-03-09 39 views
1

我有一個腳本,需要在每個值上運行。它基本上採取的參數返回一個數字,像下面在awk中運行命令並將結果存儲到位

>>./myscript 4832 
>>1100 

my.csv包含以下內容:

123,4832 
456,4833 
789,4834 

我的命令

cat my.csv | awk -F',' '{$3=system("../myscript $2");print $1,$2,$3'} 

myscript是無法明白,我傳遞第二個輸入字段$2作爲參數。我需要腳本的輸出作爲第三列添加到輸出中。

預期的輸出是

123,4832,1100 
456,4833,17 
789,4834,42 

其中,第三字段是從myscript具有第二場作爲參數的輸出。

+0

我不清楚'$ 2'是什麼意思。第一個命令行參數是'$ 1',但Awk變量'$ 1'與shell變量'$ 1'截然不同,意味着完全不同。你能否澄清一下你期望在這裏發生什麼? – tripleee

+1

另請注意[無用的'cat'](http://www.iki.fi/era/unix/award.html) – tripleee

+0

我希望my.csv文件中的第二個字段值作爲參數我的腳本並將腳本的結果保存爲my.csv中的第3個字段 – pythonRcpp

回答

0

您需要分別指定$2在字符串連接,這是

awk -F',' '{ system("echo \"echo " $1 "$(../myexecutable " $2 ") " $3 "\" | bash"); }' my.csv 
+0

它給了我'127100 4832155200921276976 :沒有這樣的文件或目錄.ter4832155200921276984' Myscript返回在換行答案(應該是一個問題?)。 127100和4 ... 6是我的2列值my.csv – pythonRcpp

+0

基本原因是您的問題未能指定您實際需要的內容。但是'system(「echo」)'可能不是任何問題的好答案。 – tripleee

+0

將'$ 2'放在雙引號之外的基本建議是現成的,但是, – tripleee

0

我們可以在GNU-AWK使用Two-Way Communications with Another Process

awk -F',' '{"../myscript "$2 |& getline v; print $1,$2,v}' my.csv 

你,

 
123 4832 1100 
456 4833 17 
789 4834 42 
awk -F',' 'BEGIN { OFS=FS }{"../myscript "$2 |& getline v; print $1,$2,v}' my.csv 

你,

 
123,4832,1100 
456,4833,17 
789,4834,42 
+0

這給了我只有我的腳本的結果。 腳本值(我的腳本輸出是換行符,我不知道這是一個問題) – pythonRcpp

+0

它不打印$ 1,$ 2但v(以空格爲前綴) – pythonRcpp

+0

向我們展示您的預期輸出問題 –

0

從GNU awk的在線文檔:

系統:執行操作系統命令的命令,然後返回到awk程序。返回命令的退出狀態(詳見下文)。

你需要使用函數getline getline piped documentation

1

如果您正試圖添加第三場與myscript $2的輸出,其中$2是第二個字段的值,嘗試

awk -F , '{ printf ("%s,%s,", $1, $2); system("../myscript " $2) }' my.csv 

,我們利用便利的事實是,myscript的輸出將在沒有換行符的情況下用計算值和換行符完成輸出。

這不是Awk的好用處;你不妨做

while IFS=, read -r first second; do 
    printf "%s,%s," "$first" "$second" 
    ../mycript "$second" 
done <my.csv 

我假設你需要用逗號分隔輸出;改變這個空間分隔顯然是一個微不足道的修改。

+0

它返回我,outputbyscript我試着運行'while IFS =,讀-r第一秒;做printf「%s,%s」,「$ first」「$ second」;完成 pythonRcpp

+0

是的,你沒有提供給第三個字段*和換行符的'myscript',正如我試圖解釋的那樣。如果你想要'printf'的換行符,那就是'printf'%s,%s,\ n「」$ first「」$ second「'但是......我真的無法猜測你想在哪裏使用這個。 – tripleee

+0

不,我只是試圖在不調用腳本的情況下檢查命令,它應該已經打印出第1列2 – pythonRcpp

0

你想要的語法是:

awk 'BEGIN{FS=OFS=","} 
{ 
    cmd = "./myscript \047" $2 "\047" 
    val = ((cmd | getline line) > 0 ? line : "NaN") 
    close(cmd) 
    print $0, val 
} 
' file 

扭捏,則對getline一部分,如果你喜歡做不同的錯誤處理,並確保你閱讀和使用函數getline前充分了解http://awk.freeshell.org/AllAboutGetline

+0

它只打印來自我的腳本的輸出。要模擬而不是myscript運行任何可以接受1個參數的bash命令 – pythonRcpp

+0

我發佈的腳本** DOES **將'myscript'的stdout保存到名爲'val'的變量中。如果沒有發生,那麼你要麼複製/粘貼不正確,要麼'myscript'的輸出不會執行stdout。嘗試將調用改爲'「./myscript \ 047」$ 2「\ 047 2>&1」來查看它的輸出是否會改爲stderr。 –

相關問題