Shell 如果其他条件在awk内
我想将过滤后的输出保存到$FILES>$TEMP_文件,将未过滤的输出保存到$FILES>${DST}/${FILES}。我的问题是我的“如果”条件不起作用Shell 如果其他条件在awk内,shell,unix,if-statement,awk,Shell,Unix,If Statement,Awk,我想将过滤后的输出保存到$FILES>$TEMP_文件,将未过滤的输出保存到$FILES>${DST}/${FILES}。我的问题是我的“如果”条件不起作用 awk ' NF { data = substr ($0, 1, 14) count = gsub (/0/, "",
awk '
NF {
data = substr ($0, 1, 14)
count = gsub (/0/, "", data)
}
{if (count==12) print $FILES > $TEMP_FILE;
else print }' $FILES > ${DST}/${FILES}
此外,给定这个字符串
900502000755602188000000514223500GS
如何将第22位和第23位(00)替换为第10位和第11位(75)?我的输出将是90050200075560218800075514223500GS,这是一个shell命令行问题 您需要像这样转义
“;”
“\;”
或者根据下面的评论删除它
转义在cygwin ksh上绝对有效——在“真实”k shell上可能不同。请记住,在(单引号)awk
脚本中,$FILES
和$TEMP_FILE
是对$0
的引用,因为文件和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
指定的名称,该变量通过-v TEMP_FILE=“$TEMP_FILE”
参数传递给awk
,并将未修改的数据打印到标准输出,从而${DST}/${FILES}
。我注意到,尽管名称不同,${FILES}
必须列出一个文件,以便I/O重定向正常工作
在AFAICT中,脚本处理至少包含14个字符的行。如果前14个字符中有12个零,则应将数据打印到一个文件中;否则,应将未更改的行打印到替代文件。如果事实上,在这两种情况下都应该打印未更改的行(只是打印到不同的输出),则从print data>TEMP\u文件中删除数据,您的输入数据是什么样子的?您是否尝试过在第一个块和第二个块之间执行{print count}
?这部分工作正常,awk'NF{data=substr($0,1,14)count=gsub(/0/,“”,data)}{if(count==12)print}“$FILES>$TEMP\u文件…”。。。但是当我添加else条件时,我得到了一个错误。$FILES
和$TEMP\u FILE
在哪里定义?另外,正如我之前所说的,显示一个数据示例会很有帮助。您不应该创建多个用户帐户。与此相关的问题应该在那里问。你确定吗?脚本是一个单引号字符串,因此其中没有任何转义。转义时对我有效!无需逃避代码>,事实上,如果它位于行的末尾,您可以删除它。如果将其转义,则会收到此消息^反斜杠不是第行的最后一个字符
,其中^
指向\\中的反斜杠代码>如果我只想在第一个字符等于“5”时过滤记录怎么办?如何添加到您提供的条件中?在NF
模式之前,添加$0!~/^5/{next}
?TEMP_文件上的输出将打印所有以“5”开头的记录,而不仅仅是过滤后的记录。怎么样?用if/else
将条件放在块中;可能是if($0~/^5/)打印$0>临时文件
,然后可能是在当前if
之前打印一个else
。规范仍然有点含糊不清,但是您可以将测试放在代码中合适的位置,以确保它生成正确的答案,非常感谢。如果你不介意的话,我还有一个问题。给定此字符串900502000755602188000000514223500GS,如何用第10位和第11位(75)替换第22位和第23位(00)?我的产量将为90050200075560218800075514223500GS。