単一行パラメータに基づいてテキストファイルから行を抽出する

単一行パラメータに基づいてテキストファイルから行を抽出する

私はスクリプトに初めて触れたので、助けてくれてありがとう。場合によっては、かなり長いテキストファイルがあり、テキスト行の各部分の長さは約6/7行です。これはログファイルで、各セクションはタイムスタンプという単語で始まります。各行の間には空行があります。各プロファイル行はセミコロンで終わります。

timestamp=201706291035.....;
  line 2;
  line 3;
  line 4;
  line 5;
  line 6;
  line 7;

timestamp=201706291038.....;
  line 2;
  line 3;
  line 4;
  line 5;
  line 6;

1行の各セクションを別のテキストファイルに抽出できる必要があります。最後のセミコロンなしで使用することをお勧めします。

timestamp=201706291035.....;line 2;line 3;line 4;line 5;line 6;line 7
timestamp=201706291038.....;line 2;line 3;line 4;line 5;line 6

この情報は解決策を見つけるのに十分ですか?

以下は簡単な例です。


タイムスタンプ=2017-06-28-01.01.35.080576;
ユーザーID = user1
;アプリケーション
ID = 10.10.10.10.11111.12345678901;


タイムスタンプ = 2017-06-28-01.01.36.096486;
ユーザーID = user1
;アプリケーション
ID = 10.10.10.10.11111.12345678901; table.field, table.field ここで table.field = 値


@steeldriverスクリプトを実行した後、ソースファイルとターゲットファイルは同じように見えます。

ベストアンサー1

これは、次のように慣用的なawkを使用して実行できます。

awk '$1=$1' RS= OFS= infile

出力:

timestamp=201706291035.....;line 2;line 3;line 4;line 5;line 6;line 7;
timestamp=201706291038.....;line 2;line 3;line 4;line 5;line 6;

説明する

ここにはたくさんのものが含まれています。基本的には3つのステップがあります。

  1. RSまず、入力はレコード区切り文字()に基づいてレコードに分割されます。
  2. 各レコードは、フィールド区切り文字(FS)に基づいて複数のフィールドに分割されます。
  3. 印刷時に、出力フィールド区切り記号(OFS)がフィールド区切り文字として使用されます。

awkが入力を解析すると、いくつかの暗黙の規則が適用されます。データはレコードごとに区切られ、一度に1レコードずつ読み取られますRS(デフォルトは\n)。RS上記の例のように空の場合は、空行でレコードを区切ります。したがって、各部分はレコードとして読み込まれます。

強制的にawk置き換えるには、最初のフィールドをそれ自体に設定します。FSOFS$1

編集する

指摘したとおりスチールドライバー、OPは末尾のセミコロンを削除しようとします。恥ずかしい盗作:

awk '{ sub(/;$/,"",$NF); $1=$1 } 1' RS= OFS= infile

おすすめ記事