如果在awk里面还有条件

时间:2014-08-22 06:41:53

标签: shell unix if-statement awk

我想将过滤后的输出保存在$ FILES> $ TEMP_FILE和$ FILES的未过滤输出> $ {DST} / $ {FILES}。我的问题是我的“如果”条件不起作用。

 awk '                                          
 NF {                                           
   data  = substr ($0, 1, 14)                 
   count = gsub (/0/, "", data)               
    }

 {if (count==12) print $FILES > $TEMP_FILE;
  else print }' $FILES > ${DST}/${FILES}

此外,给定此字符串       90050200075560218800000514223500GS 如何将第22位和第23位(00)替换为第10位和第11位(75)?我的输出将是90050200075560218800075514223500GS

2 个答案:

答案 0 :(得分:1)

请注意,在(单引号)awk脚本中,$FILES$TEMP_FILE$0的引用,因为FILESTEMP_FILE是未初始化的变量,因此相当于0。

您似乎想要的可能是:

awk -v TEMP_FILE="$TEMP_FILE" '
NF  {
    data  = substr ($0, 1, 14)
    count = gsub (/0/, "", data)
    }
    { if (count == 12) print data > TEMP_FILE
      else print
    }' $FILES > ${DST}/${FILES}

这应该将修改后的数据打印到shell变量$TEMP_FILE指定的名称,该名称通过awk参数传递给-v TEMP_FILE="$TEMP_FILE",并将未修改的数据打印到标准输出,因此{{ 1}}。我注意到,尽管它的名称,${DST}/${FILES}必须列出一个文件,I / O重定向才能正常工作。

AFAICT,脚本处理至少包含14个字符的行。如果前14个字符中有12个零,则应将数据打印到一个文件中;否则,未更改的行应该打印到备用文件。如果实际上在两种情况下(仅针对不同的输出)都应该打印未更改的行,则从${FILES}删除data

答案 1 :(得分:-1)

它是一个shell命令行问题。

你需要像";"一样逃避"\;"

或者根据以下评论删除它。

逃避肯定适用于cygwin ksh - 在“真正的”k shell上可能有所不同。