使用awk(或sed)根据下一行的第一个字符删除换行符

时间:2010-02-05 15:00:35

标签: bash shell sed awk

这是我的情况:我有一个大文本文件,我想从中提取某些信息。我使用sed根据regexp获取所有相关信息,但我提取的每一条“信息”都在一个单独的行上,我希望每个“记录”都在它自己的行上,这样它就可以很容易地导入到DB 以下是我的数据样本:

  

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但是如果你能给我一个从这开始它真的很感激!谢谢!

5 个答案:

答案 0 :(得分:6)

$ perl -0pe 's/\n,/,/g' < test.dat
92831,499,000,0644321
79217,999,000,5417178,PK91622,PK90755

翻译:在没有行分隔的情况下批量阅读,只用逗号替换换行符后面的每个逗号。

此处最短的代码!

答案 1 :(得分:2)

好吧,我想我应该仔细看看在awk中使用Records时我昨晚想弄明白这一点......看了之后10分钟我就开始工作了。对于任何有兴趣的人,我是如何做到这一点的: 在我原来的sed脚本中,我在每个记录的开头前面添加了一个额外的换行符,所以现在每个记录都有一个空行。然后我使用以下awk命令:

  

awk'BEGIN {RS =“”; FS =“\ n”}
      {
          if(NF> = 3)
              for(i = 3; i <= NF; i ++)
                  打印$ 1,$ 2,$ i
      }“

它就像一个以我想要的方式输出的魅力!

答案 2 :(得分:1)

sedsed -d -n ':t;/^,/!x;H;n;/^,/{x;$!bt;x;H};x;s/\n//g;p;${x;/^,/!p}' filename

答案 3 :(得分:1)

没有特殊套管领域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 }
'

答案 4 :(得分:1)

这可能对您有用:

# 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个,。然后在嵌入的换行符和第六个字段之间插入前四个字段。