【问题标题】:INSERT NEW STRING BETWEEN TWO STRING STATEMENTS在两个字符串语句之间插入新字符串
【发布时间】:2015-01-07 14:53:06
【问题描述】:

我有许多格式为

的多行文本文件
222 333 444 _benny
300 400 500 _andrew
311 411 511 _reusee
322 433 544 _benny
500 500 600 _andrew

我需要取出 _benny 到 _andrew 的字符串,并在它们之间再插入一个带有 _yahoi 的字符串,这样输出就变成了

222 333 444 _benny
250 321 422 _yahoii
300 400 500 _andrew

我试过awk '/_benny/,/_andrew/' filename

但它只显示文本

【问题讨论】:

  • 第一个字段是什么?只有一次或每个_benny/_andrew?
  • 对于每个条目
  • 300 400 500 _andrew 是文件的第二行。其余的发生了什么。为什么不是从第一行到500 500 600 _andrew
  • 其余部分也会更新
  • 你需要澄清你的输出应该使用什么逻辑生成?

标签: linux bash shell awk terminal


【解决方案1】:

这个 awk 脚本

awk '/_benny/,/_andrew/ { if ( $0 ~ /_benny/ ) { print $0; print "250 321 422 _yahoii"; next } { print } }' filename

将产生(假设)期望的结果

222 333 444 _benny
250 321 422 _yahoii
300 400 500 _andrew
322 433 544 _benny
250 321 422 _yahoii
500 500 600 _andrew

根据@ed-morton 的评论避免/start/,/end/,您也可以试试这个:

awk '{ if ( $0 ~ /_benny/ || $0 ~ /_andrew/ ) { if ( $0 ~ /_benny/ ) { print $0; print "250 321 422 _yahoii"; next } { print } } }' filename

【讨论】:

  • 永远不要使用/start/,/end/,因为它会使琐碎的事情变得更简洁,但即使是稍微不平凡的事情也需要完全重写和/或复制条件(就像你一样)。始终使用 /start/{f=1} f; /end/{f=0} 或类似名称。
  • 谢谢。我不是 awk 专家,所以如果你愿意用我的脚本的更正版本来说明你的建议,那就太棒了。
  • awk '/_benny/{f=1; $0 = $0 ORS "250 321 422 _yahoii"} f; /_andrew/{f=0}' file
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多