Datenmanipulation

Datenmanipulation

Ich habe die unten genannten Daten.

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

Die erforderliche Ausgabe ist unten.

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

Antwort1

Ich bin sicher, dass Sie es viel einfacher in awk machen können, aber awk mag mich nicht besonders, also ist hier meine Version davon, bei der ich alles außer der Küchenspüle verwende. Angenommen, die Daten befinden sich in einer Datei namens file1

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'

Inhalt von Datei1

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

Ausgabe des obigen Befehls

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

Antwort2

$ 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

Verwenden Sie es zunächst sed, um die Eingabe in Absätze umzuwandeln (durch eine neue Zeile getrennt). perlFügen Sie dann die Zeilen in jedem Absatz zusammen und drucken Sie sie aus.

Dies könnte vollständig in Perl erfolgen, aber ich war faul und entschied, dass es einfacher wäre, es einfach in Absätze umzuwandeln, bevor ich es in ein einfaches Perl-Skript weiterleite.

verwandte Informationen