【问题标题】:search for a string in file and change the next line using awk在文件中搜索字符串并使用 awk 更改下一行
【发布时间】:2012-03-06 16:06:27
【问题描述】:

我有一个非常具体的问题,我想搜索包含第一个单词的行 *Contro_Contact 在 file1 中,当找到它时,我想用 anthor file2 中的另一行替换 2 行之后的行,以便从文件 2 中自动更改参数

*CONTROL_CONTACT
$#  slsfac    rwpnal    islchk    shlthk    penopt    thkchg     orien    enmass
0.100000     0.000         2         1         4         0         1         0

输出可能是

*CONTROL_CONTACT
$#  slsfac    rwpnal    islchk    shlthk    penopt    thkchg     orien    enmass
0.2340000     0.000         2         1         4         0         1         0

我从另一个文件中得到的更改行,所以这不是问题。

我将等待专家的建议。

【问题讨论】:

  • 哪种语言/操作系统?你都尝试了些什么?这不是“给我codez”网站:)
  • 我尝试过使用 Linux .. 但我是新手,我可以使用 MATLAB 来完成,但我需要使用 linux,因为我是新手,所以我正在尝试从技巧中学习。什么时候会告诉我,一旦我注意到它并根据需要进行更改并重新发布,如果有人想要的话:) stackoverflow.com/users/62951/antony-scott
  • 如果您适当地标记您的问题,它将帮助人们帮助您。如果您使用的是 linux,听起来您可以使用 grep 之类的东西。我不是 linux/unix 专家,所以不能给你更多。我知道有现有的工具可以做这种事情。
  • 您可以尝试使用 sed 或 perl 以及匹配第一行(包括 \n)的正则表达式,然后替换下一行中的内容
  • 感谢 scott 和 roex,我曾尝试使用 Awk ,并且我正在尝试使用 Awk ,如果 Ihttp://stackoverflow.com/users/446140/reox 成功,我也会发布解决方案问候,stackoverflow.com/users/62951/antony-scotthestackoverflow.com/users/62951/antony-scott

标签: linux string awk replace


【解决方案1】:
awk 'N != 0 || $0 != "*CONTROL_CONTACT"
  N == 0 && $0 =="*CONTROL_CONTACT"{
    N = 1; print; getline; print
    getline; getline < "file2"; print}' file1

【讨论】:

  • 我误解了这个问题。我认为只需要处理第一次出现的“*CONTROL_CONTACT”。去掉 N 代码处理所有出现。
  • 那是完美的,但是使用 awk 是否有可能像使用 sed -i -e 你已经告诉我的那样进行更改。我的意思是可以写一个新文件,重命名,然后删除这个原始文件并重命名旧文件,或者放在临时文件夹中。
  • 不,awk 没有相当于 Perl 的和一些 seds' -i 选项,用于就地编辑。
  • 好的.. stackoverflow.com/users/874188/tripleee 感谢您的回答,我设法通过将文件交换到临时文件夹来做到这一点。谢谢-stackoverflow.com/users/851677/jfgagne 也为您提供指导,因为我的代码即将完成.. 热烈的问候
【解决方案2】:

这可能对你有用:

sed -e '/^\*CONTROL_CONTACT/{n;n;r file2' -e 'd}' file1

或者这个(仅限 bash):

sed '/^\*CONTROL_CONTACT/{n;n;r file2'$'\n'';d}' file1

或者如果文件 2 中有多个 CONTROL_CONTACT 和多个参数(仅限 GNU sed):

sed -e '/^\*CONTROL_CONTACT/{n;n;R file2' -e 'd}' file1

【讨论】:

  • 你的代码工作正常,但问题是,在命令提示符下它工作正常,但在 shell 脚本中给出了一个错误,即 50 个字符是多余的。 stackoverflow.com/users/967492/potong
  • @hamaskhan 可能是你的 shell 不是 bash,请使用第一种或第三种解决方案
  • 它也很完美,谢谢 potong.. 这是一个很好的紧凑型代码。stackoverflow.com/users/967492/potong
【解决方案3】:
$ sed -r "/^\*CONTROL_CONTACT/{n;n;s/^\S*/$(head -1 file2)/p;d}" file1

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2019-01-24
    • 2012-05-10
    • 1970-01-01
    • 2021-01-16
    • 2011-09-03
    相关资源
    最近更新 更多