数据处理

数据处理

我有一个数据如下所述。

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

所需的输出如下。

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

答案1

我确信你可以在 awk 中轻松完成此操作,但 awk 不太喜欢我,所以这里是我使用除厨房水槽之外的所有东西的看法。假设数据位于名为 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'

文件1的内容

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

上述命令的输出

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

答案2

$ 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

首先用于sed将输入转换为段落(以换行符分隔)。然后perl将每个段落中的行连接在一起并打印出来。

这可以完全用 Perl 完成,但我很懒,认为在管道传输到简单的 Perl scipt 之前转换为段落会更容易。

相关内容