2017-12-05 19 views
0

以下の形式のデータがテキストファイルにある。:もし存在すれば、行を結合するシェルスクリプト

desc   : Abced ONE 12345678 Suites YUITREWQ & RTYUIO Mana 
gement 
ldesc   : Abced ONE 12345678 Suites YUITREWQ & RTYUIO Man 
agement (BCD-WQ-UIO, BCD-WQ-BN) 
date       : 

出力を以下の形式で取得しようとしています。

desc       : Abced ONE 12345678 Suites YUITREWQ & RTYUIO Management 
ldesc       : Abced ONE 12345678 Suites YUITREWQ & RTYUIO Management (BCD-WQ-UIO, BCD-WQ-BN) 

基本的に私はコロンの後にコロンが、何を持っているすべての行が削除されなければならないし、任意の行があれば、それはスペースを含め、前の行にマージする必要があり、コロンを持っていない場合します。

私はawkを使用しようとしましたが、進めません。

よろしくお願いいたします。

+0

マージする3行以上ありますか?もし 'awk 'なら:/ $/{next} {ORS = /:/? "": "\ n"} 1 'ファイル'が機能しない場合、より良い入力サンプルを与えることを検討してください – Sundeep

答えて

0

前の行と行をマージするには、あなたが合併するかしないかを知るまで、改行を印刷避けなければなりません。ファイルの終わりに達したときに最終改行を印刷するのを忘れないでください!

awk '/:./ { printf "%s", $0; pending=1; next } 
    /:$/ { if (pending) printf "\n"; pending=0; next } 
    pending { printf "%s\n", $0; pending=0 } 
    END { if (pending) printf "\n" }' file 
+0

こんにちは、これは、すべての新しい行を削除するという問題です。したがって、すべてのデータは1行にまとめられます。 – user2854333

+0

質問のテストデータで動作するように見えました。あなたが説明していることのためのデータを表示できますか? – tripleee

+0

実際、私は間違っているコーナーケースを見つけました。私はコードをそれに応じて更新しました。申し訳ありません。 – tripleee

0

は、あなたがあなたの結果と期待してしまっただろうexp1.txt

awk -F: 'length($2) { print $0 }' exp1.txt 

ファイル名を想定します!

私の出力:

(public)landpacks-MacBook-Pro:stackoverflow frank$ cat exp1.txt 
desc   : Abced ONE 12345678 Suites YUITREWQ & RTYUIO Mana 
gement 
ldesc   : Abced ONE 12345678 Suites YUITREWQ & RTYUIO Man 
agement (BCD-WQ-UIO, BCD-WQ-BN) 
date       : 
(public)landpacks-MacBook-Pro:stackoverflow frank$ awk -F: 'length($2) { print $0 }' exp1.txt 
desc   : Abced ONE 12345678 Suites YUITREWQ & RTYUIO Mana 
ldesc   : Abced ONE 12345678 Suites YUITREWQ & RTYUIO Man 
(public)landpacks-MacBook-Pro:stackoverflow frank$ 
+0

これは動作しません。私はデータではっきりしないかもしれません。データをもう一度修正しました。 – user2854333

+0

@ user2854333すでに回答を更新しています! –

+0

ご協力ありがとうございました:) – user2854333

関連する問題