Aquí podría ser tu PUBLICIDAD


Cómo unir las primeras n líneas en un archivo

votos
8

Estoy tratando de limpiar algunos datos, y eventualmente quisiera ponerlos en formato CSV.

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

Me gustaría reemplazar todas las líneas nuevas, excepto las tres (\ n) con una coma.

Los datos se ven así:

field1
field2
field3
field1
field2
field3

etc.

Lo necesito en

field1,field2,field3
field1,field2,field3

¿Alguien tiene una manera simple de hacer esto usando sed o awk? 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.

Publicado el 12/03/2009 a las 21:45
fuente por usuario Sheldon Ross
En otros idiomas...        العربية       

8 respuestas

votos
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 las últimas tres líneas e imprime en cada tercera línea. Desafortunadamente, esto solo funciona con archivos que tienen un múltiplo de 3 líneas.

Un script 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 últimas tres líneas se concatenan en una sola cadena, con el separador de coma insertado siempre que el número de línea no sea un múltiplo de 3. Al final del archivo, la cadena se imprime si no está vacía con el final coma eliminada

Respondida el 12/03/2009 a las 09:55
fuente por usuario mouviciel


Aquí podría ser tu PUBLICIDAD


votos
5

Versión Awk:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}'
Respondida el 12/03/2009 a las 10:08
fuente por usuario ashawley

votos
4

Una solución Perl que es un poco más corta y que maneja archivos que no tienen un múltiplo de 3 líneas:

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt
Respondida el 13/03/2009 a las 04:16
fuente por usuario J. A. Faucett

votos
1

Esto podría funcionar para usted:

paste -sd',,\n' file

o esto:

sed '$!N;$!N;y/\n/,/' file
Respondida el 24/02/2012 a las 07:45
fuente por usuario potong

votos
1

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

awk 'ORS=NR%3?OFS:RS' OFS=, infile
Respondida el 13/03/2009 a las 12:22
fuente por usuario Dimitre Radoulov

votos
1

archivo de gato | perl -ne 'chomp (); imprime $ _,! (++ $ i% 3)? "\ n": ","; '

Respondida el 12/03/2009 a las 10:01
fuente por usuario jj33

votos
0

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

Respondida el 02/04/2009 a las 05:06
fuente por usuario zh_

votos
0

versión vim:

:1,$s/\n\(.*\)\n\(.*\)\n/,\1,\2\r/g
Respondida el 13/03/2009 a las 05:06
fuente por usuario chappar