【问题标题】:Concatenating multiple lines with a discriminator用鉴别器连接多行
【发布时间】:2011-01-14 05:39:53
【问题描述】:

我有这样的输入

输入:

a,b,c
d,e,f
g,h,i
k,l,m
n,o,p
q,r,s

我希望能够用“|”之类的鉴别器连接这些行

输出:

a,b,c|d,e,f|g,h,i 
k,l,m|n,o.p|q,r,s

该文件有 100 万行,我希望能够像之前的示例一样连接行。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 你想像这样连接成 3 组还是想连接成 1 大行?

标签: scripting sed awk


【解决方案1】:

@OP,如果你想为每 3 条记录分组,

$ awk 'ORS=(NR%3==0)?"\n":"|"' file
a,b,c|d,e,f|g,h,i
k,l,m|n,o,p|q,r,s

使用 Perl,

$ perl -lne 'print $_ if $\ = ($. % 3 == 0) ? "\n" : "|"' file
a,b,c|d,e,f|g,h,i
k,l,m|n,o,p|q,r,s

【讨论】:

    【解决方案2】:

    由于您的标签包含sed,因此这是一种使用方法:

    sed 'N;N;s/\n/|/g' datafile
    

    【讨论】:

    • 只有2行会不会有问题?
    • 我不确定我是否理解,但如果你的意思是你希望结果是每两行(而不是三行)合并为一行,所以你得到 "a,b,c|d ,e,f" 然后像这样使用一个 "N":sed 'N;s/\n/|/g' datafile
    • @Dyno,如果OP想每3行连接一次,而他的文件中只有2行,上面的将不起作用。 (如果 OP 仍然想将这两行与“|”连接在一起)
    【解决方案3】:

    傻瓜:

    BEGIN {
      state=0
    }
    
    state==0 {
      line=$0
      state=1
      next
    }
    
    state==1 {
      line=line "|" $0
      state=2
      next
    }
    
    state==2 {
      print line "|" $0
      state=0
      next
    }
    

    【讨论】:

      【解决方案4】:

      如果 Perl 没问题,你可以试试:

      $i = 1;
      while(<>) {
              chomp;
              unless($i % 3)
              { print "$line\n"; $i = 1; $line = "";}
              $line .= "$_|";
              $i++;
      }
      

      运行:

      perl perlfile.pl 1millionlinesfile.txt
      

      【讨论】:

        【解决方案5】:
        $ 粘贴 -sd'|'输入 | sed -re 's/([^|]+\|[^|]+\|[^|]+)\|/\1\n/g'

        使用paste,我们将这些线连接在一起,然后sed 将它们切分。该模式抓取 3 个以管道终止的字段,并用换行符替换它们各自的最终管道。

        使用 Perl:

        #! /usr/bin/perl -ln
        
        push @a => $_;
        if (@a == 3) {
          print join "|" => @a;
          @a = ();
        }
        
        END { print join "|" => @a if @a }
        

        【讨论】:

        • 不是说它会发生,但是,如果 OP 的数据包含“|”怎么办本身?那么 sed 正则表达式会搞砸。
        猜你喜欢
        • 2023-03-21
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多