如何在我的脚本中编写awk脚本?

时间:2016-05-17 19:26:45

标签: bash shell awk

我编写了一个脚本来填充另一列的列。所以下面是我的脚本文件 - 为此我将列数据复制到另一个文件 -

script.sh-

  echo "number of parameters is $#"

  if [ $# != 1 ]; then
  USAGE="USAGE: $0 cassPassword"
  echo ${USAGE}
  exit 1
  fi

  Password=$1


  echo "copy home.admin (my_references, id, eff_date) to 'myStatement.cql';" > copyInputs.cql
  cqlsh -u dgadmin -p ${cassPassword} -f copyInputs.cql

  cp myStatement.cql updatestmt.cql

之后,我为一些字符串操作创建了一个单独的awk脚本 my_refs.awk

     #!awk
      BEGIN { FS = "," }  # split fields on comma
       {

        doing some manipulation

sub(/,$/, "", crefs)  # remove trailing comma
crefs=crefs"}"
print "update table set cross_refs ="crefs" where id='"$(NF-1)"' and effective_date ='"$(NF)"'"
   }

运行awk -f my_refs.awk updatestmt.cql> updateStatement.cql 在updateStatement.cql中获取值后再次返回到我的sh脚本并进行一些修改。

sed -i "s/$/';/" updateStatement.cql

我能不能在我的shell脚本文件中写入awk脚本?这样我就可以避免两步过程

2 个答案:

答案 0 :(得分:1)

我怀疑你可以写:

#!/bin/bash
if [[ $# -eq 0 ]]; then
    echo "usage: $0 cassPassword" >&2
    exit 1
fi

echo "copy home.admin (my_references, id, eff_date);" |
cqlsh -u dgadmin -p "$1" |
awk '
    BEGIN {
        FS = ","
        update_fmt = "update table set cross_refs=%s where id='\''%s'\'' and effective_date='\''%s'\'';"
    }
    {
        # ... some manipulation: I assume you create "crefs" variable here
        sub(/,$/, "}", crefs)
        printf(update_fmt, crefs, $(NF-1), $NF);
    }
' > updateStatement.cql

bash不允许您在单引号字符串中嵌入单引号。整个awk脚本是单引号字符串,我想在“update_fmt”字符串中放入单引号。这就是为什么你看到奇怪的'\''

echocqlshawk命令都与管道连接,因此您不需要任何临时文件。我假设cqlsh可以从stdin读取命令并写入stdout。

答案 1 :(得分:0)

是的 - 您可以将awk命令粘贴到shell脚本中:

# beginning part omitted...
cp myStatement.cql updatestmt-temporary.cql
awk -f my_refs.awk updatestmt-temporary.cql > updateStatement.cql
sed -i "s/$/';/" updateStatement.cql
rm updatestmt-temporary.cql