2016-03-23 7 views
0

1つのタイムスタンプに関連するすべての行がオンになるように、ログファイル内の行を「アンパース」する方法(2つの新しい行区切り文字 - '@'と '|')を理解するのに苦労しています。 1行パターンに基づいて行をマージする

Example: 
2016-03-22 blah blah blah 
|blah blah 
|blah blah blah 
@blah 
|blah blah blah 
2016-03-22 blah blah blah 
|blah blah blah 
@blah blah 
@blah blah blah 
|blah 

必要な出力

2016-03-22 blah blah blah |blah blah |blah blah blah @blah |blah blah blah 
2016-03-22 blah blah blah |blah blah blah @blah blah @blah blah blah |blah 

は、私は、これはその後、2016年に新しい行を追加するためにsedを使って1行にすべてを置くためにxargを使用することにより、単にsussed思っていたが、私は文字上の限界がある発見しましたログファイルが非常に大きいので、xargsは複数の行を作成していました。

|で始まる行からキャリッジリターンを削除する@はこれを解決しますが、これをどうやって行うかを見分けることはできません。

私はここで検索し、同様の質問を投稿している人がいくつか見つかりましたが、sed/awk/xargsで十分に精通していないため、私の問題に適合するソリューションの一部を解釈できません。

誰かが何か提案をすることができれば幸いです。

おかげ

+0

問題解決に数時間を費やしています。その後、質問を投稿します。 5分後に解決策が見つかります! 'catファイル| sed ':a; N; $!ba; s/\ n// g' | sed '/ 2016 -/\ n2016-/g'' – Gareth

+0

答えとして説明するファイル。 –

答えて

1

あなたは、このawkコマンドを使用することができます。

awk '/^[0-9]{4}(-[0-9]{2}){2}/ { 
    if (p!="") 
     print p 
    p=$0 
    next 
} 
{ 
    p = p OFS $0 
} 
END { 
    print p 
}' file 

2016-03-22 blah blah blah |blah blah |blah blah blah @blah |blah blah blah 
2016-03-22 blah blah blah |blah blah blah @blah blah @blah blah blah |blah 
0

anubhavaの答えは動作しますが、それは、それを印刷する前に、各ラインの全体をバッファします。

これは、各入力行を読み取るときに表示されます。 @または|

  • ?OFSもしマッチしたリード
  • :そうOFS(出力フィールドセパレータ、デフォルトでは空白)と
    • (NR>1)我々が上がらない場合は」で始まる

      awk '{printf "%s%s", /^[|@]/?OFS:(NR>1)?"\n":"", $0} END{print ""}' 
      
      • /^[|@]/マッチライン最初の行のt
      • ?"\n"出力改行
      • :""そうでない場合は、出力のブランク我々は改行で最後の行を終了してください
    • END{print ""}を(出力の最上部に空白行を避けるため)
  • 0

    この(GNUのSED)あなたのために働くかもしれない:

    sed ':a;N;/\n....-..-.. /!s/\n/ /;ta;P;D' file 
    

    読むパターンスペースに改行が開始されていない場合の2行は、新しいレコードをスペースで置き換えて、既存のものに別の行を追加してください。 追加された行が新しいレコードの開始点である場合は、最初の行を印刷して削除して繰り返します。

    0

    、改行を削除する行の末尾に改行を追加し、それぞれ2016年の前に改行を挿入します。

    echo '2016-03-22 blah blah blah 
    |blah blah 
    |blah blah blah 
    @blah 
    |blah blah blah 
    2016-03-22 blah blah blah 
    |blah blah blah 
    @blah blah 
    @blah blah blah 
    |blah ' | tr -d '\n' | sed -e 's/$/\n/' -e 's/2016-/\n2016-/g' 
    
    0

    しかし、どのようにこの言葉が両方のファイルに存在する場合、ライン(ラインからのみ言葉を)マージします? Gnome 2環境では、すべての単語が自動的に変更され、ファイル1.txtおよび2.txtもパッケージマネージャのスクリプトの一部として自動的に変更されます。そして、 "リンク" http://link

    例のINPUTを意味します

    リンク1/autotoolsの-dev_20100122.1

    LINK4/debhelper_8.0.0

    1.TXTが検出され、HTTPおよびパッケージのバージョンが含まれています

    link5/dreamchess_0.2.0

    link5/dreamchess_0.2.0-2

    LINK7/quilt_0.48

    LINK7/quilt_0.48-7

    link34 /キルトel_0.46.2

    link34 /キルトel_0.46.2-1

    2.txt 。パッケージの必要な拡張機能が含まれています。

    のautotools-devの_ * diff.gz

    debhelperの_ *をdiff.gz

    debhelperの_ *。_ *。diff.gz

    libmxml-devを_ *。DSC

    libmxml-devを_ *。は

    libmxml-devのをorig.tar.gz orig.tar.gz

    libsdl1.2-devを_ *。diff.gz

    libsdl1.2-devを_ *。DSC

    libsdl1.2-devを_ *。orig.tar.gz

    libsdl-image1.2-devを_ *。diff.gz

    libsdl-image1.2-devを_ *。DSC

    libsdl-image1.2-devを_ *。

    をorig.tar.gz

    キルト_ * diff.gz

    所望の出力3.txtファイルへ:

    リンク1/autotoolsの-dev_20100122.1.diff.gz

    link4/debhelper_8.0.0.diff.gz

    link4/debhelper_8.0.0.orig.tar。GZ

    libmxml-devを_ *。diff.gz

    libmxml-devを_ *。DSC

    libmxml-devを_ *。

    libsdl1.2-devを_ *。デフをorig.tar.gz。 GZ

    libsdl1.2-devを_ *。DSC

    libsdl1.2-devを_ *。

    libsdをorig.tar.gz L-image1.2-DEV _ *。diff.gz

    libsdl-image1.2-DEV _ *。DSC

    libsdl-image1.2-DEV _ *。orig.tar.gz

    LINK7/automaticalyファイルに共通のパッケージ名を検出しquilt_0.48.diff.gz

    LINK7/quilt_0.48-7.diff.gz

    ので必要なスクリプト、1.TXTと2.txtと3を提出します。パッケージ名が存在する同じ行にtxt適切な挿入:

    • httpとファイル1.TXTからバージョンのファイル2.txtから

    • 延長

    1.TXTファイルにパッケージ名を含まないファイル2.txtから

  • ライン

  • 関連する問題