我想将过滤后的输出保存在$ 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
答案 0 :(得分:1)
请注意,在(单引号)awk
脚本中,$FILES
和$TEMP_FILE
是$0
的引用,因为FILES
和TEMP_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上可能有所不同。