1

残念ながら、私はリストされている 3 つのツールのいずれについても専門家ではないので、皆さんにお尋ねします。

複数のセクションに分割できる大きなテキスト ファイルがあり、各セクションにはヘッダーABCとフッターがあり&&ます。典型的なファイルは次のようになります。

ABC

...

<ID>
123

...

&&

ABC

...

<ID>
124

...

&&

特定の に基づいてセクションを取得する必要があります。IDたとえば、 の場合ID=123、出力を次のようにしたいと考えています。

ABC

<ID>
123

&&

ABC <ID>と と の間に123ランダムデータがある場合&&。実際のID, 123, は可変です。

各サブセクションを見つけるのにうまくawk '/ABC/,/\&\&/'いくと思いますが、正しいIDに対応するサブセクションを取得する方法がわかりません。助けてくれてありがとう。

編集:質問とサンプル入力を明確にしました。

4

4 に答える 4

1

ABC ... <ID> ... &&このソリューションは、入力ファイルがセクションのみで構成されており、空白行で区切られている可能性があることを前提としています。

利用方法: awk -f foo.awk ID=123 input_file

foo.awk:

#!/usr/bin/awk -f
BEGIN {
    RS = "\n&&\n";
    ORS = RS;
}

match($0, "<ID>\n" ID "\n") {
    sub(/^\n/,"",$0);
    print $0;
}

/usr/bin/awkawkと一致し、foo.awkを実行可能にした場合は、直接呼び出すことができます。./foo.awk ID=123 input_file

このコードは、入力を1行のそれぞれのレコードに分割します&&
次に、レコードを検索して

<ID>
your_id

一致するものが見つかった場合は印刷します。

sub(/^\n/,"",$0);セクション間の空白行を削除するだけです。

これを1行にまとめることもできます。

 awk 'BEGIN{ID=124;RS="\n&&\n";ORS=RS};match($0, "<ID>\n" ID "\n") {sub(/^\n/,"",$0);print $0;}' input_file
于 2012-07-25T19:46:57.213 に答える
0

これはうまくいくかもしれません(GNU sed):

id=123
sed '/^ABC/,/^&&/{/^ABC/{h;d};H;/^&&/!d;g;/<ID>\n'"$id"'/p};d' file

別の方法:

sed ':a;$bb;N;/^ABC/!D;/&&$/!ba;:b;/^ABC.*<ID>\n'"$id"'.*&&$/p;d' file
于 2012-07-25T20:10:44.527 に答える
0

sed では、次のことができます。

sed -i ' /ABC/,/&&/ !{d} ' FILE

これにより、ABC と && の間のすべてのコンテキストが保持されます。

于 2012-07-25T18:31:53.487 に答える
0

使用法:awk -v id=123 -f foo.awk foo.txt

foo.awk

$0=="ABC",$0=="&&"{
    # store everything in data
    # ternary operation to avoid leading "\n"
    data=data?(data "\n" $0):$0
}


id_flag {
    # this is a string after "<ID>"
    if (id==$1) { 
       print_flag = 1
    }
    id_flag = 0
}

$0=="<ID>"{
    # prepare to read id
    id_flag = 1
}

$0=="&&"{
    if (print_flag) {
      print data
      print_flag = 0
    }
    data = ""
}
于 2012-07-25T18:45:48.643 に答える