Hay un archivo que contiene datos en un formato 'n*1':

1
2
3
4
5
6

¿Hay alguna forma de convertirlo a un formato 'n*3' como:

1,2,3
4,5,6  

A través de awk en lugar de utilizar for loop?

Realmente no tengo idea de esto ... Cualquier ayuda o palabra clave es apreciada.

awk
3
SuperDelta 28 feb. 2018 a las 11:53

5 respuestas

La mejor respuesta

Usando awk

$ awk '{printf "%s%s",$0,(NR%3==0?ORS:",")}' File
1,2,3
4,5,6

El comando printf "%s%s",$0,(NR%3==0?ORS:",") le dice a awk que imprima dos cadenas. El primero es $0, que es la línea actual. La segunda cadena es NR%3==0?ORS:"," que es ORS el separador de registro de salida (si el número de línea es un múltiplo de tres) o bien , para todos los demás números de línea.

Usando sed

$ sed 'N;N;s/\n/,/g' File
1,2,3
4,5,6

Por defecto, sed lee en cada línea del archivo uno por uno. N le dice a sed que lea en otra línea, agregando la línea a la actual, separada por una nueva línea. N;N le dice a sed que haga eso dos veces para que tengamos un total de tres líneas en el espacio del patrón. s/\n/,/g le dice a sed que reemplace esas dos nuevas líneas de separación con comas. Luego se imprime el resultado.

Lo anterior supone que estamos usando GNU sed. Con modificaciones menores, se puede hacer que funcione con BSD / OSX sed.

3
John1024 28 feb. 2018 a las 09:09

El más simple: comando paste :

paste -d, - - - <file

La salida:

1,2,3
4,5,6
2
RomanPerekhrest 28 feb. 2018 a las 09:07

Prueba esto:

awk 'NR%3==0{print;next}{printf "%s,",$0}' file

O descompuesto:

NR%3==0           # condition, modulo 3 == 0
{print;next}      # then print and skip to the first line
{printf "%s,",$0} # printf to not print newlines but current int + ,
1
Gilles Quenot 28 feb. 2018 a las 09:12
$ awk '{ORS=(NR%3?",":RS)}1' file
1,2,3
4,5,6
1
Ed Morton 28 feb. 2018 a las 16:02

Siguiente puede ayudarlo en lo mismo.

xargs -n3  <  Input_file | sed 's/ /,/g'
1
RavinderSingh13 28 feb. 2018 a las 09:00