【问题标题】:How run AWK command in Shell Script?如何在 Shell 脚本中运行 AWK 命令?
【发布时间】:2012-04-26 02:53:13
【问题描述】:

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

我有一个文件$LOG/order_"$id".txt,它在两个字符串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 上复制并粘贴此命令,它会起作用。

请指教。

【问题讨论】:

  • 在黑暗中射击:您是否尝试将“/CUT:$j....”部分周围的简单引号替换为双引号?

标签: shell scripting awk


【解决方案1】:

您的引用是正确的,但是您应该使用变量传递而不是尝试在 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 编写整个内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多