Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/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
与命令行版本相反,awk独立脚本不工作_Awk - Fatal编程技术网

与命令行版本相反,awk独立脚本不工作

与命令行版本相反,awk独立脚本不工作,awk,Awk,我有一个单行gawk脚本,可以按预期工作: '/pattern/ {$n="new string"}1' 现在,我想将上述内容与其他命令一起放在一个独立的gawk脚本中,但到目前为止,我还不知道如何使其工作 我的文件以以下内容开头: BEGIN { FS = "," OFS = FS } { here goes my code } 特别是,由于代码的语法稍有不同,我不确定将/pattern/放在括号内还是括号外,但可能是在这里我弄错了 我对“1”的位置也有同样的怀疑 所以我正在更新这个,因

我有一个单行gawk脚本,可以按预期工作:

'/pattern/ {$n="new string"}1'
现在,我想将上述内容与其他命令一起放在一个独立的gawk脚本中,但到目前为止,我还不知道如何使其工作

我的文件以以下内容开头:

BEGIN {
FS = ","
OFS = FS
}

{
here goes my code
}
特别是,由于代码的语法稍有不同,我不确定将/pattern/放在括号内还是括号外,但可能是在这里我弄错了

我对“1”的位置也有同样的怀疑

所以我正在更新这个,因为我不确定上面的内容是否足够清楚——这是我的错

我有一个CSV文件,有4个字段1-4,我想匹配字段3中的特定模式,在匹配的模式上,用新字符串替换所有字段内容

在一个呆滞的一行,我可以做到这一点,与以下:

awk -F, -v OFS="," '/pattern/ {$3="new string"}1
我希望将上述代码移动到awk脚本中,其他命令将出现在其中,以便实现相同的结果-即:

输入文件:

yellow, yellow and blue, yellow and red, blue
blue, yellow and blue, yellow and red, red
red, yellow and red, blue and red, blue
red, yellow and blue, yellow and blue, red
图案:红色 感兴趣领域:3 新字符串:tree

期望输出:

yellow, yellow and blue, tree, blue
blue, yellow and blue, tree, red
red, yellow and red, tree, blue
red, yellow and blue, yellow and blue, red

AWK脚本有三个部分-开始、正文和结束。你的oneliner只使用身体部位。等效脚本如下所示:

BEGIN {
  FS = ","
  OFS = FS
}

/pattern/ {
    print $1,$2,"new string",$3
}

!/pattern/ {
  print $0
}
正文语法本身可以重复:

/pattern1/ {
    action 1
}

/pattern2/ {
    action 2
}

标题有点误导人,因为这一行没有对应的脚本。我可以建议你试着用一个更好的标题回来吗?应该是这样的awk-vn=6'BEGIN{FS=OFS=,}/pattern/{$n=newstring}1'文件另一个问题:$n表示变量名为n中包含的值。因为n没有定义,所以它的值是0,所以在本例中$n表示$0。这是一种相当隐晦的表示0美元的方式。当我写这篇文章时,kvantour通过将n设置为某个值来纠正这一点。末尾的1表示一个新的body指令,这意味着如果为真1,则打印整行,这是省略{}部分时的默认操作。这意味着模式可以被条件替换。尝试上述操作,结果与预期不符,所有$n都被替换为$n=new_字符串中提供的值,而不是只替换那些与/pattern/匹配的记录。开始{FS=,OFS=FS}/pattern/{$3=new_string}1预期结果:匹配/pattern/:$1未更改的记录,$2未更改的记录,$3新_string,$4未更改的记录不匹配/pattern/:$1未更改的记录,$2未更改的记录,$3未更改的记录,$4未更改的记录需要一个与其他记录匹配的块。我更新了提议的script@kofemann:在代码的当前状态下,由于1 behind}的存在,非匹配行被打印两次,匹配行被正确打印一次,不替换,再打印两次。@pierrefrancois Right。固定的