2012-11-12 23 views
0

這是我的shell腳本,它從stdin接收用戶輸入的字符串。awk如何區分參數和輸入文件?

#!bin/sh 
printf "Enter your query\n" 

read query 
cmd=`echo $query | cut -f 1 -d " "` 
input_file=`echo $query | cut -f 2 -d " "` 
printf $input_file 

if [ $input_file = "" ] 
then 
    printf "No input file specified\n" 
    exit 
fi 
if [ $cmd = "summary" ] 
then 
    awk -f summary.awk $input_file $query 
fi 

比方說,他進入

summary a.txt /o foo.txt 

現在cmd變量將採取價值summaryinput_file將採取a.txt。 這不正確嗎?

我想summary.awk根據$query中的內容在$input_file上工作。

我的理解如下:

  1. 的第一個命令行參數傳遞被視爲輸入文件。 例如:如果輸入文件是管道awk 'code' file arg1 arg2 arg3file被視爲輸入文件

  2. ,它沒有看到任何的參數作爲輸入文件。 例如:cat file | awk 'code' arg1 arg2 arg3 arg1不視爲輸入文件。

對嗎?

問題是 我得到awk: cannot open summary (No such file or directory) 爲什麼試圖打開summary? 這是$input_file之後的下一個單詞。

如何解決此問題?

+0

而不是「讀取查詢」,然後用'cut'解析'$ query',只需要:'read cmd input_file remaining'(確保IFS是一個合理的值) –

+0

另請參見[本答案]中的建議(http ://stackoverflow.com/q/18825007/812102)。 –

回答

3

如果沒有-f選項,則將第一個非選項參數視爲腳本,其餘參數爲輸入文件。如果有-f選項,則腳本來自該文件,其餘爲輸入文件。

當且僅當沒有輸入文件參數時,它從標準輸入讀取輸入。這意味着如果你管道awk,並給它的文件名參數,它會忽略管道。

這與大多數Unix文件處理命令相同。

試試這個:

awk -f summary.awk -v query="$query" "$input_file" 

這將awk的變量query設置查詢的內容。

+0

因此,將數據傳遞給awk腳本的正確方法是使用-v選項?否則,傳遞的參數必定會被視爲要迭代的輸入文件? – batman

+0

是的。我認爲你可以在腳本中讀取並分配「ARGV」來刪除輸入文件,但這不是實現你想要的最好方法。 – Barmar

+0

我試着在我的awk腳本中打印'query'。它說:「非法引用變量查詢」。我們是否必須在'$ query'或者類似的地方使用雙引號?我的意思是,它仍然在shell腳本文件中,所以,我們必須? – batman