Perl は、2 つのモード間の複数のデータラインを 1 つの出力ラインに結合します。

Perl は、2 つのモード間の複数のデータラインを 1 つの出力ラインに結合します。

ファイル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 構成のために入力を 1 行ずつ処理します。線が次に何が起こるのかわからないので、線の接続が難しくなります。

入力を文字列として処理するときは、スマート置換を実行して行を連結できます。以下は、Perlを呼び出す方法に似た例です。

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

スクリプトは文字列($ data)の完全な入力を読み取り、タイミングの前の改行を空白に置き換えます。これはすべての場合に当てはまります(gスイッチをグローバルに交換)。

答え2

GNU sedソリューション:

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

答え3

Perl 1行バージョン:

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

関連情報