2009-10-03 12 views
23

Con un simple script bash genero un archivo de texto con muchas líneas de la siguiente manera:¿Cómo puedo emparejar cada dos líneas de un archivo de texto con Bash?

192.168.1.1 
hostname1 
192.168.1.2 
hostname2 
192.168.1.3 
hostname3 

Ahora quiero volver a formatear este fichero para que se parezca a esto:

192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 

¿Cómo me reformatearlo de esta manera? Tal vez sed?

+1

¿por qué no se genera a presentar en el formato conveniente para empezar? – SilentGhost

Respuesta

28
$ sed '$!N;s/\n/ /' infile 
192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 
+0

¿Podrías explicar cómo es? – NawaMan

+0

gracias. exactamente lo que busco :) – fwaechter

+5

@NawaMan: Si quieres decir "¿cómo funciona?" luego: si no (!) la última línea ($), a continuación, agregue la siguiente línea (N) y reemplace la nueva línea entre ellos con un espacio (s/\ n//) y repita el inicio con la siguiente línea (que será la 3º, 5º, etc.). –

30

Aquí hay una concha única alternativa:

while read first; do read second; echo "$first $second"; done 
+1

Pero debería [siempre] (http://wiki.bash-hackers.org/commands/builtin/read#read_without_-r) usar la bandera '' -r'' con '' leer''. –

+1

¿La línea 'done' necesita' 'done

13

Me encanta la sencillez de esta solución

cat infile | paste -sd ' \n' 

192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 

o que sea separado por comas en lugar de espacio separado

cat infile | paste -sd ',\n' 

y si su archivo de entrada ha d una tercera línea como la marca de tiempo

192.168.1.1 
hostname1 
14423289909 
192.168.1.2 
hostname2 
14423289910 
192.168.1.3 
hostname3 
14423289911 

entonces el único cambio es añadir otro espacio en el que la lista delimitador

cat infile | paste -sd ' \n' 

192.168.1.1 hostname1 14423289909 
192.168.1.2 hostname2 14423289910 
192.168.1.3 hostname3 14423289911 
+0

Esto es conciso, fácil de entender y muy escalable. ¡Gracias! – musiphil

Cuestiones relacionadas