2009-03-12 26 views
8

Estoy tratando de limpiar algunos datos, y eventualmente quisiera ponerlos en formato CSV.Cómo unir las primeras n líneas en un archivo

He usado algunas expresiones regulares para limpiarlo, pero estoy atascado en un paso.

Me gustaría reemplazar todas las líneas nuevas (\ n) con la coma.

Los datos se parece a esto:

field1 
field2 
field3 
field1 
field2 
field3 

etc ..

lo necesito en

field1,field2,field3 
field1,field2,field3 

Alguien tiene una forma sencilla de hacer esto usando awk o sed? Podría escribir un programa y usar un ciclo con un contador de mod para borrar cada 1ra y 2da charla de nueva línea, pero prefiero hacerlo desde la línea de comando si es posible.

Respuesta

7

Con awk:

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

Este script guarda los últimos tres líneas e imprimirlos en cada tercera línea. Desafortunadamente, esto solo funciona con archivos que tienen un múltiplo de 3 líneas.

Un guión más general es:

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 

En este caso, las tres últimas líneas se concatenan en una sola cadena, con el separador de coma insertada cada vez que el número de línea no es un múltiplo de 3. Al al final del archivo, la cadena se imprime si no está vacía con la coma final eliminada.

1

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

5

Awk:

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

Un Perl que es un poco más corto y que trata los archivos que no tienen un múltiplo de 3 líneas: la versión

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

Buena uno de los archivos no-a múltiplos de tres. Sabía que el mío no lo manejaba, pero no vi la solución en 3 minutos. – jj33

0

vim:

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

Use nawk o /usr/xpg4/bin/awk en Solaris:

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

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

1

Esto podría funcionar para usted:

paste -sd',,\n' file 

o esto:

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