ファイル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