ヘッダーごとにチャンクに分割されたデータのリストがあります。タイトルの先頭と末尾には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