【问题标题】:Replace previous when match regular expression匹配正则表达式时替换前一个
【发布时间】:2014-01-08 22:46:13
【问题描述】:

当当前行开始不是数字时,我需要删除上一行的“行尾”^[!0-9],基本上如果匹配,追加到之前的行,我是sed & awk n00b,顺便说一句,真的很喜欢他们。谢谢

编辑:

$ 猫文件

1;1;1;text,1
2;4;;8;some;1;1;1;more
100;tex
t
broke

4564;1;1;"also
";12,2121;546465

$“脚本”文件

1;1;1;text,1
2;4;;8;some;1;1;1;more
100;text broke 
4564;1;1;"also";12,2121;546465

【问题讨论】:

  • 目前没有时间给出完整的答案,但基本上您只需将最后一行保留在变量中,直到您看到下一行,然后决定如何处理它。单独打印或与当前行一起打印。然后,您需要确保在输入全部完成后打印最后一行(awk 或类似的 END 块。

标签: regex bash csv sed awk


【解决方案1】:

您没有发布任何示例输入或预期输出,所以这是一个猜测,但听起来像您要求的:

$ cat file
a
b
3
4
c
d
$ awk '{printf "%s%s",(NR>1 && /^[[:digit:]]/ ? ORS : ""),$0} END{print ""}' file
ab
3
4cd

关于 OP 新发布的输入:

$ awk '{printf "%s%s",(NR>1 && /^[[:digit:]]/ ? ORS : ""),$0} END{print ""}' file
1;1;1;text,1
2;4;;8;some;1;1;1;more
100;textbroke
4564;1;1;"also";12,2121;546465

【讨论】:

  • 对不起,我的意思是每一行都应该以数字开头,所以我想我应该根据需要多次运行您的答案,如果以 ^\n|^\$ 开头,这是否有效?
  • 对不起,我不知道你在问什么。更新您的原始问题以包含一些示例输入和预期输出。
  • 请原谅我的英语也不是我的母语,我希望现在更清楚,感谢您的帮助 Ed!
  • 你试过我的脚本了吗?除了textbroke 而不是text broke 之外,它会根据您发布的输入准确地产生您说的输出,但您还没有告诉我们可以用来执行此操作的规则。
  • 正在运行,大约有 250 万行,大约需要 5 分钟,顺便说一句,并非所有行都有相同数量/类型的字段
【解决方案2】:

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

sed -r ':a;$!N;s/\n([^0-9]|$)/\1/;ta;P;D' file

在模式空间中保留两行,如果第二行的开头为空或不以整数开头,则删除换行符。

【讨论】:

    【解决方案3】:

    如果你的系统上有 Ruby

      array = File.open("file").readlines
      array.each_with_index do |val,ind|  
        array[ind-1].chomp! if not val[/^\d/]    # just chomp off the previous item's \n
      end
      puts array.join
    

    输出

    # ruby test.rb 
    1;1;1;text,1
    2;4;;8;some;1;1;1;more
    100;textbroke
    4564;1;1;"also";12,2121;546465
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多