2

我正在尝试在 for 循环中使用 AWK 创建文件,但得到空文件。看起来 AWK 没有被执行。你能指教一下,这里有什么不正确的吗?

我有一个文件$LOG/order_"$id".txt,它在 2 个字符串等之间有一些行CUT:1CUT2我只需要将这些行放在单独的文件中,所以我写了这个 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 上复制并过去这个命令,它就可以工作。

请指教。

4

1 回答 1

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 编写整个内容。

于 2012-04-26T03:22:32.870 回答