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

标签 shell scripting awk

我尝试在 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 上复制并粘贴此命令,它就会起作用。

请指教。

最佳答案

您的引用是正确的,但是您应该使用变量传递,而不是尝试在 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/

相关文章:

linux - 如何连接两个或多个存储在awk脚本中的变量中的字符串

javascript - 如何在 Javascript 中执行 shell 命令

bash - 使用 Ansible 创建新用户和密码

java - 如何从java中的javascript调用返回数组?

mysql - Rails 3.1 + Daemons gem 不允许我访问我的数据库

linux - sed 删除包含多个引号的行中引号内的匹配项

awk - 我们可以在 awk 中使用 shell 变量吗?

linux - 如何导出每天的磁盘空间使用情况?

linux - 如何在 CentOs 中编辑 initramfs 以在引导后添加新分区

c# - 将 Lua 与 C#/Mono 结合使用