2012-07-24 41 views
6

聲明一個awk功能我有一個awk腳本是由稱爲:在bash

awk -f myawkfile.awk arguments 

的awk腳本是使用相同的上述呼叫被叫進我的bash腳本。

可以,而不是調用awk腳本聲明它作爲我的bash 腳本中的函數。我認爲通過在前面和後面寫awk可以很容易地勾選整個代碼,然後分配一個函數名稱來隨意調用它。 不知何故,它沒有辦法。

我想這樣做,因爲我不希望我的腳本依賴於另一個腳本。 而我不是編寫awk腳本的人。它需要一個文件作爲輸入,做一些 的東西,並返回在我的腳本中使用的修改後的文件。

+0

***爲什麼***你不希望你的腳本依賴於另一個腳本?我更願意堅持每個腳本文件一種語言。它使測試,閱讀和維護它變得更容易! – Johnsyweb 2012-07-24 11:58:57

+0

是的!你是對的,但在臨時文件夾中運行腳本會使依賴關係成爲負擔。 – Gil 2012-07-24 12:05:10

+0

爲什麼不在你的'$ {PATH}'的某處安裝awk腳本? – Johnsyweb 2012-07-24 12:19:33

回答

9

使用heredoc notation一個能寫這樣的事情

#!/bin/bash 

awk_program=$(cat << 'EOF' 
    /* your awk script goes here */ 
EOF 
) 

# ... 

# run awk script 
awk "$awk_program" arguments 

# ... 
+0

工作太棒了!我從來不知道這個把戲:(謝謝你的伴侶!爲我節省了很多時間! – Gil 2012-07-24 12:06:07

+1

爲什麼使用heredoc?只要做:'awk_program ='把腳本放在這裏' – 2012-07-24 15:16:08

+0

@WilliamPursell因爲腳本被問及和哪個是從問題中刪除的內容超過20行。內聯會使其不可讀和不可維護(這可能不是必需的,但最好保留這種可能性)。 – xaizek 2012-07-24 17:51:03

2

只寫一個函數的awk腳本:

#!/bin/sh -e 

foo() { awk '{print $2}' "[email protected]"; } 
foo a b       # Print the 2nd column from files a and b 
printf 'a b c\nd e f\n' | foo # print 'b\ne\n' 

注意,awk的標準似乎對行爲曖昧如果空字符串作爲參數傳遞,但shell保證"[email protected]"擴展爲零字段而不是空字符串,因此如果您使用空參數調用foo,這只是一個問題。

+0

我無法按照您的建議聲明我的awk腳本! – Gil 2012-08-03 19:28:28

+0

@Geekasaur爲什麼不呢?你遇到了什麼錯誤? – 2012-08-03 19:42:52