Tengo datos como se menciona a continuación.
host_name Server1.domain.com
contacts DL - Desktop
contact_groups ravi, raj, rahim
host_name Server2.domain.com
contact_groups DL-Server
host_name Server3.domain.com
host_name Server4.domain.com
contacts Services,helpdesk,manager
La salida requerida se encuentra a continuación.
host_name Server1.domain.com, contacts ravi,raj,rahim, Contact_group DL-Desktop
host_name Server2.domain.com contact_groups DL - Server
host_name Server3.domain.com
host_name Server4.domain.com contacts services,helpdesk,manager
Respuesta1
Estoy seguro de que puedes hacerlo fácilmente en awk, pero no le agrado mucho a awk, así que aquí está mi opinión usando todo menos el fregadero de la cocina. Suponiendo que los datos están en un archivo llamado archivo1
export output=; while read line; do if [[ "$line" =~ "host_name" ]]; then export output="${output}\n"; fi; export output="${output}, $line"; done < file1 && echo -e $output | sed 's/^, \?//' | sed '/^$/d'
Contenido del archivo1
host_name Server1.domain.com
contacts ravi, raj, rahim
contact_groups DL - Desktop
host_name Server2.domain.com
contact_groups DL-Server
host_name Server3.domain.com
host_name Server4.domain.com
contacts Services,helpdesk,manager
Salida del comando anterior
host_name Server1.domain.com, contacts ravi, raj, rahim, contact_groups DL - Desktop
host_name Server2.domain.com, contact_groups DL-Server
host_name Server3.domain.com
host_name Server4.domain.com, contacts Services,helpdesk,manager
Respuesta2
$ sed -e '2,$ s/^host_name/\n&/' ravi.txt |
perl -n -e 'if (! m/^$/) {
chomp;
$line .= $_ . ", "
};
if (m/^$/ || eof) {
$line =~ s/ +/ /g; # merge multiple spaces into one space
$line =~ s/, $//; # strip the trailing comma
print $line,"\n" ;
$line=""
}'
host_name Server1.domain.com, contacts DL - Desktop, contact_groups ravi, raj, rahim
host_name Server2.domain.com, contact_groups DL-Server
host_name Server3.domain.com
host_name Server4.domain.com, contacts Services,helpdesk,manager
Primer uso sed
para convertir la entrada en párrafos (separados por una nueva línea). Luego, perl
unir las líneas de cada párrafo e imprimirlas.
Esto se podía hacer completamente en Perl, pero era vago y decidí que era más fácil convertirlo en párrafos antes de convertirlo en un simple script en Perl.