2012-04-26 122 views
2

我想在for循環中使用AWK創建文件,但獲取空文件。它看起來像AWK沒有得到執行。你能告訴我,這裏有什麼不對嗎?如何在Shell腳本中運行AWK命令?

我有2串CUT:1CUT2等之間的一些行的文件$LOG/order_"$id".txt ..我只是需要在不同的文件中這些行,所以我寫了這個for循環。

for ((i=1; i<=$CNTLN; i++)) 
do 
    j=`expr $i - 1` 
    /usr/bin/awk '/CUT:$j/, /CUT:$i/' $LOG/order_"$id".txt > $LOG/order_"$id"_"$i".txt 
done 

此產生的空白文件但是如果我複製和過去外殼該命令,它的工作原理。

請指教。

+2

在黑暗中拍攝:您是否嘗試用「/ CUT:$ j ....」部分的雙引號替換簡單的引號? – JScoobyCed 2012-04-26 02:58:36

+0

偉大的..有效的 – 2012-04-26 03:03:54

回答

2

您的引用是正確的,但是您應該使用變量傳遞,而不是嘗試在AWK腳本中嵌入shell變量。

for ((i=1; i<=CNTLN; i++)) 
do 
    ((j = i - 1)) 
    /usr/bin/awk -v i="$i" -v j="$j" '$0 ~ "CUT:" j, $0 ~ "CUT:" i' "$LOG/order_$id.txt" > "$LOG/order_${id}_$i.txt" 
done 

當使用AWK變量,你必須使用波浪匹配運算符代替斜槓分隔的形式。

你不說你正在使用哪個shell,但基於for聲明,我猜Bash,Korn或者Z shell。如果它是其中之一,那麼您可以按照我所示的方法進行整數運算,而不使用外部的expr實用程序。在ksh或zsh的情況下,你也可以做浮動數學。

您可以消除計算j的行並將其包含在for語句中。

for ((i=1, j=0, i<=CNTLN; i++, j++)) 

在一些地方你使用全大寫變量名。我建議養成不這樣做的習慣,以避免與shell或環境變量的名稱衝突。在這種情況下這不是問題,但是這是一個好習慣。

其實,現在我想到了。 shell循環可以被刪除,並且整個事情都是用AWK編寫的。