大きなテキストブロックセット内で2つのテキストブロックを逆方向に並べ替える

大きなテキストブロックセット内で2つのテキストブロックを逆方向に並べ替える

ヘッダーごとにチャンクに分割されたデータのリストがあります。タイトルの先頭と末尾には6つの「=」記号があります。表示できるタイトルの数は制限されていますが、毎回すべてのタイトルが表示されるわけではありません。しかし、毎回同じ順序で表示されます。各ブロックのデータ量はさまざまです。このデータセットでは、2つの特定のテキストブロックの順序を変更したいと思います。 (説明:ブロック内のデータの順序ではなく、ブロックが印刷される順序)

編集:別の説明:異なるヘッダーの数が制限されており、内容を知っていますが、ファイルの場所は不明な2つの特定のヘッダーを反転したいと思います。どちらか一方のみが発生する場合も、どちらも発生しない場合もあります。表示される場合は、常に同じ順序で直後に表示されます。

入力例:

======abc======
data1
data2
data3
======def======
data4
======ghi======
data5
data6
======jkl======
data7
======mno======
data8

希望の出力:

======abc======
data1
data2
data3
======def======
data4
======jkl======
data7
======ghi======
data5
data6
======mno======
data8

各ヘッダーの前に空行を追加し、次のようなsed '/======.*======/i\\'ものを使用する場合この回答役に立つかもしれませんが、Perlを使ったことがないので、私が望むように修正する方法がわかりません。私もawkがこれを行うことができると思います。

ベストアンサー1

awkを使用してください。

$ cat tst.awk
/^======[^=]+======$/ {
    key = $0
    gsub(/=/,"",key)
    keys[++numKeys] = key
}
{ key2val[key] = key2val[key] $0 ORS }
END {
    if ( (a in key2val) && (b in key2val) ) {
        tmpVal = key2val[a]
        key2val[a] = key2val[b]
        key2val[b] = tmpVal
    }
    for ( i=1; i<=numKeys; i++ ) {
        key = keys[i]
        printf "%s", key2val[key]
    }
}

$ awk -v a='ghi' -v b='jkl' -f tst.awk file
======abc======
data1
data2
data3
======def======
data4
======jkl======
data7
======ghi======
data5
data6
======mno======
data8

おすすめ記事