데이터 조작

데이터 조작

아래와 같은 데이터가 있습니다.

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 스크립트로 파이핑하기 전에 단락으로 변환하는 것이 더 쉽다고 결정했습니다.

관련 정보