2010-02-08 4 views
1

У меня есть вход как этотобъединения нескольких линий с дискриминатором

Вход:

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 

Файл имеет 1Million линии, и я хочу, чтобы иметь возможность конкатенации строк, как в примере раньше.

Любые идеи о том, как подойти к этому?

+1

Вы хотите объединиться в группы из 3 подобных или вы хотите объединить в одну большую линию? – Pace

ответ

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 
+0

Праведный awk fu. +1 –

0

простак:

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

Если Perl отлично, вы можете попробовать:

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

бежать:

perl perlfile.pl 1millionlinesfile.txt 
0
$ paste -sd'|' input | sed -re 's/([^|]+\|[^|]+\|[^|]+)\|/\1\n/g'

С paste, соединим линии вместе , а затем sed кубики t верх выше. Образец захватывает три поля с завершенным контуром и заменяет их соответствующие конечные трубы новыми линиями.

С Perl:

#! /usr/bin/perl -ln 

push @a => $_; 
if (@a == 3) { 
    print join "|" => @a; 
    @a =(); 
} 

END { print join "|" => @a if @a } 
+0

не сказал, что это произойдет, но что, если данные OP содержат «|» сам? то sed regex испортится. – ghostdog74

2

Поскольку ваши метки включают sed вот способ его использования:

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

будет ли проблема, если есть только две строки? –

+0

Я не уверен, что понимаю, но если вы имеете в виду, что хотите, чтобы результат состоял в том, что каждая из двух строк (вместо трех) объединяется в одну, поэтому вы получаете «a, b, c | d, e, f», а затем просто используйте один «N» следующим образом: 'sed 'N; s/\ n/|/g' datafile' –

+0

@Dyno, если OP хочет конкатцировать каждые 3 строки, и он имеет 2 строки только в своем файле, не имеет эффекта. (если OP все еще хочет согласовать эти две строки вместе с «|») – ghostdog74

 Смежные вопросы

  • Нет связанных вопросов^_^