【问题标题】:Using awk (or sed) to remove newlines based on first character of next line使用 awk(或 sed)根据下一行的第一个字符删除换行符
【发布时间】:2010-02-05 15:00:35
【问题描述】:

这是我的情况:我有一个大文本文件,我想从中提取某些信息。我使用 sed 根据正则表达式提取所有相关信息,但是我提取的每条“信息”都在单独的行上,我希望每个“记录”都在自己的行上,以便可以轻松导入数据库。
这是我现在的数据示例:

92831,499,000
,0644321
79217,999,000
,5417178
,PK91622
,PK90755

理想情况下,我希望这个输出看起来像:

92831,499,000 ,0644321
79217,999,000 ,5417178 ,PK91622
79217,999,000 ,5417178 ,PK90755

这可能更难做到,所以我会满足于最后一个“记录”的输出只出现一次,附加的“PK...”是该行的第 4 个“字段”。
最后,我能想到的最简单的方法是,如果该行以逗号( ^, )开头,则应该删除它之前的换行符......我对 awk 不太熟悉,所以如果你能给我一个从这开始,真的很感激!谢谢!

【问题讨论】:

    标签: bash shell sed awk


    【解决方案1】:
    $ perl -0pe 's/\n,/,/g'

    翻译:批量阅读,不分行,换行后的每个逗号只用一个逗号。

    这里有最短的代码!

    【讨论】:

      【解决方案2】:

      好吧,当我昨晚试图解决这个问题时,我想我应该仔细看看在 awk 中使用 Records ...... 看了它们 10 分钟后,我开始工作了。对于任何对此感兴趣的人,我是这样做的: 在我原来的 sed 脚本中,我在每条记录的开头添加了一个额外的换行符,因此现在有一个空行分隔每条记录。然后我使用以下 awk 命令:

      awk '开始 {RS = ""; FS = "\n"}
      {
      如果 (NF >= 3)
      对于 (i = 3; i 打印 $1,$2,$i
      }'

      它就像一个魅力,完全按照我想要的方式输出!

      【讨论】:

        【解决方案3】:
        sedsed -d -n ':t;/^,/!x;H;n;/^,/{x;$!bt;x;H};x;s/\n//g;p;${x;/^,/!p}' filename
        

        【讨论】:

          【解决方案4】:

          没有特殊情况的字段3,很容易。

          awk '
              !/^,/   { if (NR > 1) print x ; x = $0 }
              /^,/    { x = x OFS $0 }
              END     { if (NR) print x }
          '
          

          有了,更复杂但还不算太难。

          awk '
              !/^,/   { if (n && n < 3) print x ; x = $0 ; n = 1 }
              /^,/    { if (++n > 2) { print x, $0 } else { x = x OFS $0 } }
              END     { if (n && n < 3) print x }
          '
          

          【讨论】:

            【解决方案5】:

            这可能对你有用:

            # sed ':a;N;s/\n,/,/;ta;P;D' test.dat | sed 's/,/\n/5;s/\(.*,\).*\n/&\1/'
            92831,499,000,0644321
            79217,999,000,5417178,PK91622
            79217,999,000,5417178,PK90755
            

            解释:

            这分为两部分:

            追加下一行,如果追加的行以 , 开头,则删除嵌入的新行 \n 并重新开始。如果不打印到换行符,然后删除到新行。重复。

            将第 5 个 , 替换为新行。然后在嵌入的换行符和第六个字段之间插入前四个字段。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-04
              • 2012-12-21
              • 1970-01-01
              • 1970-01-01
              • 2018-04-11
              • 2019-08-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多