2015-09-04 73 views
6

我有一個文件通過字段列表說a.txt和下面是它的內容:打印作爲一個變量

bob 1 100    
lincoln 2 200 
chris 3 300   

文件內容之間用空格分隔。

使用awk,我可以訪問每列。使用以下命令 打印由逗號分隔的第1和第3列:

cat a.txt | awk ' { print $1","$3} ' 

,我是成功的。

現在我想從另一個shell腳本動態地傳遞條件。通過說標準我的意思是 - $1","$3

我試過下面的命令,但它沒有工作。

myvar="$1" 
awk -v a="$myvar" ' { print a } ' a.txt 

但這打印$1 3倍有三排在a.txt

如何通過這種方式將awk的列表傳遞給awk?

+0

'「$ 1」'意味着你的shell腳本的第一個參數。你怎麼稱呼你的劇本? '腳本「1」'?如果'a'爲'1',則應該打印'$ a' – Kent

+0

「$ 1」,「$ 3」 - 這部分需要動態傳遞 - 以及分隔符。比如說,如果我有5列,我應該可以發送像1美元,2美元,3美元,4美元,5美元即1和2,4和5分開的逗號和休息 - 我會從另一個文件傳遞模式作爲參數awk命令將在不同的文件 –

回答

6

這裏的問題是,在變量$你傳遞給AWK字面解釋 - 它不能用於指代特定的領域。

單個字段,你可以使用這樣的事情:

awk -v field=1 '{ print $field }' file 
bob 
lincoln 
chris 

對於多個領域,這是一個有點複雜:

awk -v fields="1 3" 'BEGIN{ n = split(fields,f) } 
    { for (i=1; i<=n; ++i) printf "%s%s", $f[i], (i<n?OFS:ORS) }' file 
bob 100 
lincoln 200 
chris 300 

字段列表作爲一個字符串傳遞,它被分成一個數組。然後使用printf輸出每個字段,然後使用輸出字段分隔符OFS或輸出記錄分隔符ORS,然後使用printf循環陣列,具體取決於它是否是最後一個字段。 要使用逗號分隔字段,可以將-v OFS=,作爲選項通過。

+0

我很高興我找到了我的問題的答案。有沒有什麼辦法可以在多個文件的情況下添加分隔符到輸出中 –

+0

是的,你可以將'OFS'設置爲其他的東西比'awk -v OFS ='默認的空間' –

+0

「$ 1」,「$ 3」 - 這部分實際問題需要動態傳遞 - 以及分隔符。 5欄,我應該能夠發送像1美元,2美元,3美元,4美元,5美元即1和2,4和5分開逗號和休息的東西。 「。我將從另一個文件傳遞模式作爲參數。而awk命令將在另一個文件上。我沒有做到這一點。 –

3

您需要將分隔字符串傳遞給awk,並在awk的內部使用split分隔該分隔符。

像這樣的東西應該工作:

awk -v search='1,3' 'BEGIN{split(search, a, ",")} 
       {f=""; for (i=1;i in a;i++) {printf "%s%s", f, $a[i]; f=OFS} print ""}' file 

輸出:

bob 100 
lincoln 200 
chris 300 
+0

謝謝@TomFenech,我編輯它。不知何故''lenght'適用於BSD(OSX)awk – anubhava

+1

或捕獲長度時分裂' len = split(...)' – karakfa

2

替代awk解決方案使用cut已通過逗號分隔列表接受字段位置。

cols="1,3"; cut -d" " -f"$cols" a.txt 

爲逗號分隔輸出管​​3210或使用--output-delimiter=","切選項。

注意,這會給你靈活地指定輸入作爲封閉或開放的範圍,如1-32-