2010-02-08 11 views
1

J'ai l'entrée comme celui-ciConcaténer plusieurs lignes avec un discriminateur

Entrée:

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

Je blême de pouvoir concaténer les lignes avec un discriminateur comme « | »

Sortie:

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

Le fichier a 1 million de lignes et je veux être en mesure de concaténer des lignes comme l'exemple avant.

Des idées sur la façon d'aborder cela?

+1

Voulez-vous concaténer en groupes de 3 comme cela ou voulez-vous concaténer en 1 grande ligne? – Pace

Répondre

2

@OP, si vous voulez les regrouper pour 3 dossiers,

$ 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 

avec 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

Justin awk fu. +1 –

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

Si Perl est bien, vous pouvez essayer:

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

à exécuter:

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

Avec paste, nous rejoignons les lignes ensemble , puis sed dés ourler. Le motif saisit 3 champs terminés et remplace les tubes finaux respectifs par des retours à la ligne.

Avec Perl:

#! /usr/bin/perl -ln 

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

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

ne dit pas que cela arrivera mais, et si les données de l'OP contiennent "|" lui-même? alors le sed regex va gâcher. – ghostdog74

2

Étant donné que vos balises comprennent sed voici un moyen de l'utiliser:

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

Y aura-t-il un problème s'il n'y a que 2 lignes? –

+0

Je ne suis pas sûr de comprendre, mais si vous voulez dire que vous voulez que le résultat soit que toutes les deux lignes (au lieu de trois) soient fusionnées en une seule sorte que vous obteniez "a, b, c | d, e, f" utiliser un "N" comme ceci: 'sed 'N; s/\ n/|/g' datafile' –

+0

@Dyno, si OP veut concaténer toutes les 3 lignes, et il a 2 lignes seulement dans son fichier, ce qui précède pas d'effet. (si OP veut toujours enchaîner ces 2 lignes avec "|") – ghostdog74

Questions connexes