【问题标题】:awk standalone script not working as opposed to command line versionawk 独立脚本与命令行版本相比不起作用
【发布时间】:2020-05-18 17:01:04
【问题描述】:

我有一个按预期工作的单行 (g)awk 脚本:

'/pattern/ {$n="new string"}1'

现在,我想在一个独立的 (g)awk 脚本中包含上述内容以及其他命令,但到目前为止我无法理解如何使其工作。

我的文件开头为:

BEGIN {
FS = ","
OFS = FS
}

{
here goes my code
}

鉴于代码的语法略有不同,我特别不确定将 /pattern/(括号内还是括号外)放在哪里 - 但也许这是我弄错的地方。

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


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

我拥有的是一个包含 4 个字段 (1-4) 的 CSV 文件,我想匹配字段 #3 中的特定模式,并且在匹配该模式时,将所有该字段内容替换为新字符串。

在 (g)awk 一个班轮中,我可以做到这一点,方法如下:

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 新字符串:树

想要的输出:

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

【问题讨论】:

  • title 有点误导,因为没有与 oneline 对应的脚本。我可以建议尝试并以更好的标题回来吗?
  • 应该是这样的awk -v n=6 'BEGIN{FS=OFS=","}/pattern/{$n="new string"}1' file
  • 另一个问题:$n 表示以n 中包含的值作为名称的变量的值。由于未定义n,因此其值为0,因此在这种情况下$n 表示$0。这是表示$0 的一种相当神秘的方式。当我写这篇文章时,kvantour 通过将 n 设置为某个值来纠正这个问题。

标签: awk


【解决方案1】:

AWK 脚本包含三个部分 - BEGINBODYEND。您的 oneliner 仅使用身体部位。等效的脚本是这样的:

BEGIN {
  FS = ","
  OFS = FS
}

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

!/pattern/ {
  print $0
}

正文语法本身可以重复:

/pattern1/ {
    action 1
}

/pattern2/ {
    action 2
}

【讨论】:

  • 末尾的1 代表一个新的正文指令,意思是“如果为真(1)则打印整行”(这是省略{} 部分时的默认操作) .这意味着模式可以被条件替换。
  • 尝试上述方法,结果不如预期,all $n 被替换为 $n="new_string" 中提供的值,而不是只替换那些记录 /pattern/ 匹配的位置。 BEGIN { FS = "," OFS = FS } /pattern/ { $3="new_string" }1 预期结果:匹配 /pattern/ 的记录:$1 unchanged,$2 unchanged, $3 new_string, $4 unchanged 不匹配 /pattern/ 的记录:$1 unchanged,$2 unchanged, $3 unchanged, $4 unchanged
  • 您需要一个与其他块匹配的块。我更新了提议的脚本
  • @kofemann:在您的代码的当前状态下,由于1 后面的1 存在} 并且匹配行正确打印一次并且没有替换,因此不匹配的行被打印两次,两次以上。
  • @PierreFrançois 对。固定。
猜你喜欢
  • 2018-08-28
  • 2011-10-23
  • 2020-09-10
  • 1970-01-01
  • 2010-10-17
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
相关资源
最近更新 更多