【问题标题】:How to add a string in between consecutive lines starting with the same word?如何在以相同单词开头的连续行之间添加字符串?
【发布时间】:2017-05-17 00:41:39
【问题描述】:

我有一个文本文件,其中包含以“WordNode”和“gloss word”开头的互换行,但有时会有以“gloss word”开头的重复行:

WordNode"a'inai"
gloss word "repose"
WordNode "akti"
gloss word "running"
gloss word "turned on"
gloss word "active"
WordNode "aitco"
gloss word "Armenian"
WordNode "aitxero"
gloss word "ethereal"
gloss word "ether"

我希望能够将上一个 wordNode... 行添加到以“gloss word”开头的每个重复行:

WordNode "a'inai"
gloss word "repose"
WordNode "akti"
gloss word "running"
WordNode "akti"
gloss word "turned on"
WordNode "akti"
gloss word "active"
WordNode "aitco"
gloss word "Armenian"
WordNode "aitxero"
gloss word "ethereal"
WordNode "aitxero"
gloss word "ether"

我试过了

sed -r ':a; N; /(gloss word)[^\n]*\n\1/ s/\n.*//; ta; P; D' file1.txt > file2.txt

但它只保留第一行并删除以下重复行。使用 sed awk 或任何其他正则表达式执行此操作的正确方法是什么?

【问题讨论】:

  • 您在我的回答中评论了But this doesn't change the data at all。这是什么意思?你没有看到我给出的Awk 命令的输出?
  • @Inian 这似乎很奇怪......即使是dos风格的行尾也不会影响...... OP确实必须澄清
  • “这根本不会改变数据”我的意思是在运行代码时不会对数据进行任何更改。我想再试一次,但它被删除了。我认为@suddeep 的答案和你的一样,尝试去掉以 wordnodes 开头的行并留下以 Gloss word 开头的行。我是这个正则表达式的新手,也许我犯了一个错误。 :/幸运的是,波通的回答完全符合我的要求。谢谢大家!
  • @BitTad awk 答案给出的所有工作都符合您的示例输入的预期......要么你在尝试它时犯了一个错误,要么你拥有的 awk 版本有些奇怪......在任何案例,如果您对 potong 的回答感到满意,则应将其标记为已接受...见stackoverflow.com/help/someone-answers

标签: bash awk sed


【解决方案1】:

这可能对你有用(GNU sed):

sed '/WordNode/h;//d;x;p;x' file

将包含WordNode 的行存储在保持空间(HS)中,然后将其删除。对于所有其他行,即包含 gloss word 的行,交换到 HS,打印 HS,然后恢复到模式空间 (PS) 并打印。

【讨论】:

    【解决方案2】:

    awk 来救援!

    $ awk '/^WordNode/{header=$0; p=0} p{print header} /^gloss word/{p=1} 1' file
    
    WordNode"a'inai"
    gloss word "repose"
    WordNode "akti"
    gloss word "running"
    WordNode "akti"
    gloss word "turned on"
    WordNode "akti"
    gloss word "active"
    WordNode "aitco"
    gloss word "Armenian"
    WordNode "aitxero"
    gloss word "ethereal"
    WordNode "aitxero"
    gloss word "ether"
    

    【讨论】:

    • 打高尔夫球...awk '/^gloss word/{print h; print} /^WordNode/{h=$0}'
    • 不错!也许{if(h)print h..} 以防文件开始时没有标题
    • @Sundeep:几个小时前(现在处于已删除状态)发布了相同的答案,OP 说他根本没有看到任何输出,因此评论
    • @Inian 在您的回答下的评论中,OP 没有说他没有看到任何输出,他说“这不会改变数据”。我打赌他希望在命令运行后修改他的原始输入文件。
    • @EdMorton:啊!可能是,但仍然删除了我的。我猜这个答案比我的要好! ;)
    【解决方案3】:

    这最容易通过脚本而不是 sed 或 awk 来完成:

    while IFS= read -r line; do
        if [[ $line == WordNode* ]]; then wnl=$line; else echo $wnl; echo $line; fi
    done << file1.txt
    

    (这只会回显gloss word 行之前的最后一个WordNode 行,因此如果您希望将多个WordNode 行放在一起,并且想要将它们全部回显,那么您必须将其调整为有状态的)

    【讨论】:

    【解决方案4】:
    $ awk '/WordNode/{h=$0 ORS;next} {print h $0}' file
    WordNode"a'inai"
    gloss word "repose"
    WordNode "akti"
    gloss word "running"
    WordNode "akti"
    gloss word "turned on"
    WordNode "akti"
    gloss word "active"
    WordNode "aitco"
    gloss word "Armenian"
    WordNode "aitxero"
    gloss word "ethereal"
    WordNode "aitxero"
    gloss word "ether"
    

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2012-12-14
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多