我尝试在 for 循环中使用 AWK 创建文件,但得到空文件。看起来 AWK 没有被执行。请您指教,这里有什么不正确的地方吗?
我有一个文件 $LOG/order_"$id".txt
,其中在 2 个字符串 CUT:1
和 CUT2
之间有一些行等等..我只需要将这些行放在单独的文件中,所以我编写了这个 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 上复制并粘贴此命令,它就会起作用。
请指教。
最佳答案
您的引用是正确的,但是您应该使用变量传递,而不是尝试在 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,您也可以进行 float 学运算。
您可以删除计算 j
的行并将其包含在 for
语句中。
for (( i=1, j=0, i<=CNTLN; i++, j++ ))
在一些地方使用全部大写的变量名称。我建议养成不这样做的习惯,以避免与 shell 或环境变量发生名称冲突。在这种具体情况下,这不是问题,但这是一个好习惯。
其实,现在想想。 shell 循环可以被消除,整个事情都用 AWK 编写。
关于shell - 如何在Shell脚本中运行AWK命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10326582/