2012-09-30 139 views
0

出於某種原因,我試圖找出我得到「-bash」打印出來,這個腳本:awk函數打印..... -bash?

cat sample | awk -v al=$0 -F"|" '{n = split(al, a, "|")} {print a[1]}' 

的「樣本」文件中包含PSV「管道分隔值」,像| b | C | d | E | F | d。
我的意圖是使用一個數組。
上述腳本的結果是長度爲1的數組,並且只包含的項是「-bash」,即shell的名稱。
默認$ 0指向當前使用的程序,但據我所知,在awk腳本中,$ 0參數'應該'指向正在讀取的整個行。

因爲我想知道問題解決的地方是「我是新手bash/awk」 您能指出我下列哪個步驟失敗?
1-將樣本文件「連接」並將其作爲awk腳本的輸入傳遞
3定義一個名爲'al'的變量,其值爲'sample'中包含的每行'
3定義管道「|」作爲字段分隔符
4 - 定義一個動作,將'al'的值用管道分割成一個名爲'a'的數組作爲分隔符
5定義另一個動作,在這種情況下只是簡單地打印第一個項目array

有什麼建議嗎?謝謝!

+2

請不要用'cat',這是不必要的 - 'awk'一個文件名作爲參數。 – cdarke

回答

0

嗯...

awk -F'|' '{ print $1 }' sample 
+0

我實際上需要一個數組, – JBoy

+0

但這不是你的代碼所說的。 –

+0

正在使用split函數,它給出了一個數組,它在簡單的打印操作中使用的數組純粹用於測試目的,我在第一個問題中添加了這個。 – JBoy

1

通過-v a1=$0,要設置a1當前的計劃,這是bash的名稱。參見參數 in man bash

+0

呵呵??我認爲它會讀取由** cat sample | ** – JBoy

+0

$ 0提供的數據,默認指向當前使用的程序,但據我所知,在awk腳本中,$ 0參數'should'指向整行被讀取。 – JBoy

+1

我不確定'awk',但'$ 0'出現在awk腳本之外,所以它被shell解釋。 – choroba

2

$0由shell它運行awk之前,和$0是被因爲bash的通過登錄時運行(1)(見的當前方案,這是bash,所述-在開始的名稱擴展該exec的描述man bash內置)

您需要引用$0所以shell不展開它,和awk看到它:

awk -v 'al=$0' -F"|" '{n = split(al, a, "|")} {print a[1]}' sample 

但瓦里能夠分配處理之前讀取任何數據,因此設置變量al字符串「$ 0」在節目的一開始,它設置al每個輸入記錄的內容。

如果你想要記錄,只是說的這樣,而不是使用一個變量:

awk -F"|" '{n = split($0, a, "|")} {print a[1]}' sample 
+0

嗨喬納森,你寫的第二個版本完全謝謝你,但第一個,分配變量**'al = $ 0'**的那個仍然有一些問題,分配**'al = $ 0' **給變量'al'賦值'$ 0'(字面上)。數組的大小爲1,'$ 0'在[1], – JBoy

+0

是的,這就是我在回答中告訴你的,你讀過了嗎? _「,以便在程序開始時將變量」al「設置爲字符串」$ 0「 –