2015-06-16 76 views
1

我有一個bash陣列等訪問一個bash陣列中AWK環

myarray = (1 2 3 4 5 ... n) 

另外我讀一個文件只有一行的例如輸入:

1 2 3 4 5 ... n 

我讀它逐行到一個數組並與打印出來:

awk 'BEGIN{FS=OFS="\t"} 
    NR>=1{for (i=1;i<=NF;i++) a[i]+=$i} 
    END{for (i=1;i<NF;i++) print OFS a[i]}' myfile.txt 

myarray的大小與相同。現在myarray從索引0a開始索引1。我的主要問題是如何將bash數組傳遞給我的awk表達式,以便我可以在打印循環中使用它,並使用相應的元素。所以我試過的是這樣的:

awk -v array="${myarray[*]}" 
    'BEGIN{FS=OFS="\t"} 
    NR>=1{for (i=1;i<=NF;i++) a[i]+=$i} 
    END{for (i=1;i<NF;i++) print OFS a[i] OFS array[i-1]}' myfile.txt 

雖然這並不奏效。我沒有得到任何輸出myarray。在這個例子中我所需的輸出是:

1 1 
2 2 
3 3 
4 4 
5 5 
... 
n n 

回答

2

據我瞭解,你只需要以正確的方式在bash陣列養活awk。也就是說,通過使用split()

awk -v bash_array="${myarray[*]}" 
    'BEGIN{split(bash_array,array); FS=OFS="\t"} 
     NR>=1{for (i=1;i<=NF;i++) a[i]+=$i} 
     END{for (i=1;i<NF;i++) print a[i], array[i]}' file 

由於陣列array[]現在在awk,你不必在意指數,這樣你就可以正常調用它們,而無需在bash擔心那些無法啓動0

還請注意print a,bprint a OFS b相同(並且更清潔),因爲您已在BEGIN塊中定義了OFS

+0

謝謝。這是問題!就在旁邊:是否可以做一些像'OFS =「\ t \ t」'。因爲有時我需要其中的兩個才能正確對齊數字。 – uitty400

+0

@ uitty400當然,你可以用'echo'來測試1 2 3「| awk'BEGIN {OFS =「\ t \ t」} {print $ 1,$ 2}''。 – fedorqui

+0

這個例子的作品,但它似乎並沒有工作在我的腳本 – uitty400