代码之家  ›  专栏  ›  技术社区  ›  kal

用鉴别器连接多行

  •  1
  • kal  · 技术社区  · 15 年前

    我有这样的意见

    输入:

    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
    

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

    有什么办法吗?

    5 回复  |  直到 15 年前
        1
  •  2
  •   ghostdog74    15 年前

    @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
  •  2
  •   Dennis Williamson    15 年前

    因为你的标签包括 sed 下面是一种使用方法:

    sed 'N;N;s/\n/|/g' datafile
    
        3
  •  0
  •   Ignacio Vazquez-Abrams    15 年前

    呆呆地说:

    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
  •  0
  •   codaddict    15 年前

    如果Perl很好,您可以尝试:

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

    运行:

    perl perlfile.pl 1millionlinesfile.txt
    
        5
  •  0
  •   Greg Bacon    15 年前
    $ paste -sd'|' input | 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 }