テキストファイルのセクションの並べ替え

テキストファイルのセクションの並べ替え

次の形式の多くのセクションを含むファイルがあります。各セクションの間に空白行があることを確認してください。完成したファイルがインデックス名に基づいてアルファベット順に各セクションになるようにこのファイルをソートしたいと思います。これは可能ですか?

[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= ...

(最後に空白行があります)

参考資料:

答え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>

関連情報