Perl은 두 모드 간의 여러 데이터 라인을 하나의 출력 라인으로 결합합니다.

Perl은 두 모드 간의 여러 데이터 라인을 하나의 출력 라인으로 결합합니다.

파일 1

pure info:       myjob-relaed_rawmaterila
Timings:              Full
pure info:       Check-platform-Log-90Days
Timings:              Full
Timings:              Incremental
pure info:       Check-vitorydows-Log-90Days
Timings:              Full
Timings:              Incremental
pure info:       Note_michael
Timings:              Full
pure info:       adhoc-activity-myjob-platform
Timings:              Full
pure info:       adhoc-activity-myjob-vitory
Timings:              Full
pure info:       adhoc-myjob-platform-03
Timings:              Full
Timings:              Full-1month
pure info:       adhoc-onetime-myjob-hotcase
Timings:              Full
pure info:       adhoc-onetime-myjob-platform

출력이 필요함

pure info: myjob-relaed_rawmaterila Timings:  Full
pure info: Check-platform-Log-90Days Timings:  Full Timings:  Incremental
pure info: Check-vitorydows-Log-90Days Timings:  Full Timings:  Incremental
pure info: Note_michael Timings:  Full
pure info: adhoc-activity-myjob-platform Timings:  Full
pure info: adhoc-activity-myjob-vitory Timings:  Full
pure info: adhoc-myjob-platform-03 Timings:  Full Timings:  Full-1month
pure info: adhoc-onetime-myjob-hotcase Timings:  Full

나는 노력했다

cat file1|sed -e 's/^ //' -e 's/$// 
cat file1|perl -pe's/\n/ / if $.  % 3' 

그러나 이는 연속으로 2줄만 인쇄합니다. 추가 Timings항목이 있으면 들쭉날쭉한 출력이 됩니다.

이 문제를 어떻게 해결할 수 있나요?

답변1

Perl 솔루션과 관련하여 제공된 스크립트는 -p 구성으로 인해 입력을 한 줄씩 처리합니다. 선이 다음에 무슨 일이 일어날지 모르기 때문에 선 연결이 어려워집니다.

입력을 문자열로 처리할 때 스마트 대체를 수행하여 줄을 연결할 수 있습니다. 다음은 Perl을 호출하는 방법과 유사한 예입니다.

perl -e 'local $/;my $data = <>; $data =~ s/\nTiming/ Timing/g ; print $data' file1

스크립트는 문자열($data)의 전체 입력을 읽고 Timing 앞의 줄 바꿈을 공백으로 바꿉니다. 이는 모든 경우에 해당됩니다(g 스위치를 전역으로 교체).

답변2

GNU sed 솔루션:

sed -rz 's/\n(Timings)/ \1/g' file1

답변3

Perl 한 줄 버전:

perl -0777 -pe 's/\n(?=Timings:)/ /g' file

-0777 옵션은 Perl이 전체 ​​파일을 $_.

"타이밍" 옆에 다른 헤더가 있는 경우 부정적인 예측을 사용할 수 있습니다.

s/\n(?!pure info:)/ /g

답변4

사용:

perl -ne '
    my $s = $_ if
        /pure info:\s+myjob-relaed_rawmaterila/
        ..
       /pure info:\s+adhoc-onetime-myjob-hotcase/;
    do{
        chomp;
        s/\s{3,}/ /;
        $_ = sprintf "%s ", $s;
        s/pure info/\n$&/g;
        print
    } for $s;
    END{ print "\n" }
' file1

관련 정보