linux Shell指令碼裡面把一個數組傳遞到awk內部進行處理_linux shell

來源:互聯網
上載者:User

前段時間和幾位同事討論過一個問題:Shell指令碼裡面怎樣把一個數組傳遞到awk內部進行處理?

當時沒有找到方法。前兩天在QQ群裡討論awk的時候,無意間又聊起這個話題。機緣巧合之下找到一個思路,特此分享。

測試環境:

[root]# head -1 /etc/redhat-releaseRed Hat Enterprise Linux Server release 6.5 (Santiago)[root]# awk --version | head -1GNU Awk 3.1.7

眾所周知,Shell指令碼裡面把一個普通變數傳遞給awk是非常簡單的,直接用 -v 參數賦值就行了。

str1="Hello World"awk -v str2="$str1" 'BEGIN{print str2}'

但是,要把一個數組傳遞給awk就不是那麼簡單的事情了。請看以下三個實驗:

1. 簡單的數組可以先賦值後split

arr1=(A B C)awk -v arr2="${arr1[*]}" 'BEGIN{split(arr2,arr3," "); print arr3[2]}'

2. 有些情況下很難找到合適的分隔字元來進行split,因為某個數組元素可能會包含你想用來作為分隔字元的那個字元,這時split之後無法得到希望的結果。所以這個方法不夠嚴謹,尤其是當我們無法預測數組元素可能包含哪些字元的時候。

arr1=(A "B C" D)awk -v arr2="${arr1[*]}" 'BEGIN{split(arr2,arr3," "); print arr3[2]}'

3. 可以藉助export命令和awk的ENVIRON預設數組來實現這個功能

arr1=(A "B C" D)for((i=0;i<${#arr1[*]};i++)); do   export arr1_m$i="${arr1[$i]}"doneawk 'BEGIN{for(i in ENVIRON)if(i~/arr1_m/)print i "=" ENVIRON[i]}'

我這裡只是為了示範功能,所以沒有把export變數名的定義和awk內部的字串匹配寫的特別考究,大家可以根據實際情況進行調整(比如添加更多的限制條件等)。

結論:Shell指令碼裡面把一個數組傳遞到awk內部進行處理,技術上可行,但不建議在生產環境上使用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.