如何在Shell脚本中运行AWK命令?

时间:2012-04-26 02:53:13

标签: shell scripting awk

我正在尝试使用AWK在for循环中创建文件但是获取空文件。看起来AWK没有被执行。你能告诉我这里有什么不对吗?

我有一个文件$LOG/order_"$id".txt,它在两个字符串CUT:1CUT2等之间有一些行。我只需要在单独的文件中使用这些行,所以我写了这个for 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

这会生成空白文件但是如果我在shell上复制并通过此命令,则可以正常工作。

请告知。

1 个答案:

答案 0 :(得分: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编写。