2009-03-12 6 views
8

Sto provando a ripulire alcuni dati e vorrei infine inserirli in formato CSV.Come unire le prime n righe in un file

Ho usato alcune espressioni regolari per ripulirlo, ma sono bloccato su un unico passaggio.

Vorrei sostituire tutto ma ogni terzo carattere di nuova riga (\ n) con una virgola.

I dati si presenta così:

field1 
field2 
field3 
field1 
field2 
field3 

ecc ..

ho bisogno in

field1,field2,field3 
field1,field2,field3 

Qualcuno ha un modo semplice per farlo utilizzando awk sed o? Potrei scrivere un programma e usare un ciclo con un contatore mod per cancellare ogni 1 ° e 2 ° carattere di nuova linea, ma preferirei farlo dalla riga di comando, se possibile.

risposta

7

Con awk:

awk '{n2=n1;n1=n;n=$0;if(NR%3==0){printf"%s,%s,%s\n",n2,n1,n}}' yourData.txt 

Questo script salva le ultime tre righe e di stamparli in ogni terza linea. Sfortunatamente, funziona solo con file con più di 3 linee.

Uno script più generale è:

awk '{l=l$0;if(NR%3==0){print l;l=""}else{l=l","}}END{if(l!=""){print substr(l,1,length(l)-1)}}' yourData.txt 

In questo caso, le ultime tre righe vengono concatenate in una singola stringa, con il separatore virgola inserita quando il numero di riga non è un multiplo di 3. Alla fine del file, la stringa viene stampata se non è vuota con la virgola finale rimossa.

1

cat file | perl -ne 'chomp(); stampa $ _,! (++ $ i% 3)? "\ n": ","; ' Versione

5

Awk:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}' 
soluzione
4

Un Perl che è un po 'più corto e che gestisce i file che non hanno un multiplo di 3 linee: versione

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt 
+0

Good one sui file non mulitple-di-tre. Sapevo che il mio non l'ha gestito, ma non ho visto la soluzione in 3 minuti. – jj33

0

vim:

:1,$s/\n\(.*\)\n\(.*\)\n/,\1,\2\r/g 
1

Utilizzare nawk o /usr/xpg4/bin/awk su Solaris:

awk 'ORS=NR%3?OFS:RS' OFS=, infile 
0

awk '{ORS = NR% 3 " ":" \ n"; print}' urdata.txt

1

Questo potrebbe funzionare per voi:

paste -sd',,\n' file 

o questo:

sed '$!N;$!N;y/\n/,/' file