2015-04-23 126 views
1

我是shell腳本編程的新手,在使用的awk -FSawk -f命令之間我很困惑。我嘗試閱讀關於這兩者之間差異的多頁,但無法清楚地理解。請幫助。 下面是一個例子: 讓我們考慮一個文本文件說,data.txt有以下細節。shell腳本中awk -FS和awk -f的區別

S.No Product Qty Price 
1-Pen-2-10 
2-Pencil-1-5 
3-Eraser-1-2 

現在,當我嘗試使用下面的命令:

$ awk -f'-' '{print $1,$2} data.txt 

我得到下面的輸出:

1 Pen 
2 Pencil 
3 Eraser 

但是當我使用命令:

$ awk -FS'-' '{print $1,$2} data.txt

輸出爲:

1-Pen-2-10 
2-Pencil-1-5 
3-Eraser-1-2 

我不明白的區別它使用-FS命令。有人能幫我解釋這兩個命令之間究竟發生了什麼。謝謝!

回答

5

你比你想象的更困惑。沒有-FS

FS是一個包含字段分隔符的變量。

-F是將FS設置爲參數的選項。

-f是一個選項,其參數是包含要執行的腳本的文件的名稱。

您發佈的腳本將產生語法錯誤,你不是說他們生產的,所以IDK的怎麼告訴你輸出......

+0

謝謝!我想我非常瞭解這個概念。我的錯。謝謝澄清。將工作。 – Dev

+0

技術上'-FS' - ''與'-F「S-」'相同。因此,'回聲「QRS-TUV」| awk -FS'-''{print $ 1,$ 2}''outputs 'QR TUV' –

+0

這就是我的疑問。但是當我嘗試使用'回聲「ABC-DEF」| awk -FS'-''{print $ 1,$ 2}'',我只能得到ABC-DEF – Dev

2

-FS不是一個參數AWK。 -F是,如-f

-F參數告訴awk使用FS(字段分隔符)有什麼價值。

-f參數告訴awk使用它的參數作爲要運行的腳本文件。

此命令(我定你的報價):

awk -f'-' '{print $1,$2}' data.txt 

告訴awk使用標準輸入(這是-裝置),用於其參數。在終端中運行時應該掛起。之後應該是一個錯誤,因爲awk然後嘗試使用'{print $1,$2}'作爲文件名來讀取。

此命令:

awk -FS'-' '{print $1,$2} data.txt 

會告訴awk使用S-作爲FS值。您可以通過運行這個命令來查看:

awk -FS'-' 'BEGIN {print "["FS"]"}' 
+0

謝謝!我的錯。需要更多地研究這個概念。謝謝澄清。將工作。 – Dev