次の形式の多くのセクションを含むファイルがあります。各セクションの間に空白行があることを確認してください。完成したファイルがインデックス名に基づいてアルファベット順に各セクションになるようにこのファイルをソートしたいと思います。これは可能ですか?
[monitor:///..]
disabled = true
index = abc
sourcetype= ...
[monitor:///...]
disabled = true
index = def
sourcetype= ...
答え1
使用愚かな:
gawk -v RS="" '
match($0, /index = ([^[:space:]]+)/, m) {
stanzas[m[1]] = $0
}
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
ORS = "\n\n"
for (indx in stanzas) print stanzas[indx]
}
' file
ファイルに別のセクションを追加してみましょう。
[monitor:///..]
disabled = true
index = xyz
sourcetype= ...
[monitor:///..]
disabled = true
index = abc
sourcetype= ...
[monitor:///...]
disabled = true
index = def
sourcetype= ...
その後、gawkコマンドの結果は次のようになります。
[monitor:///..]
disabled = true
index = abc
sourcetype= ...
[monitor:///...]
disabled = true
index = def
sourcetype= ...
[monitor:///..]
disabled = true
index = xyz
sourcetype= ...
(最後に空白行があります)
参考資料:
- 組み込み文字列関数3つのパラメータの場合
match()
- gawkで事前定義された配列スキャン順序を使用する
答え2
dirktの説明を使用して作成されたBash関数:
function sort_stanzas() {
declare file_path="$1"
cat "$file_path" \
| sed -z \
-e 's/\n/\t/g' \
-e 's/\t\t/\n/g' \
| sort \
| sed -z \
-e 's/\n/\t\t/g' \
-e 's/\t/\n/g'
}
使用法:sort_stanzas <file>