Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如果其他条件在awk内_Shell_Unix_If Statement_Awk - Fatal编程技术网

Shell 如果其他条件在awk内

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/, "",

我想将过滤后的输出保存到$FILES>$TEMP_文件,将未过滤的输出保存到$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}
此外,给定这个字符串 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。