用鉴别器连接多行

时间:2010-02-08 03:45:10

标签: scripting sed awk

我有这样的输入

输入:

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万行,我希望能够像之前的例子那样连接行。

关于如何处理此事的任何想法?

5 个答案:

答案 0 :(得分:2)

@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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

GAWK:

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
}

答案 3 :(得分:0)

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

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

运行:

perl perlfile.pl 1millionlinesfile.txt

答案 4 :(得分:0)

$ 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 }