bash で改行以外のレコード区切り文字を使用してテーブルをソートする

bash で改行以外のレコード区切り文字を使用してテーブルをソートする

次のようなテーブルがあります

'a;b;f|d;e;c|g;h'

これを3列目でソートしたいとします。出力は次のようになります。

'g;h|d;e;c|a;b;f'

標準の区切り文字を使用する場合whitespacenewlineこれは標準を使用して実現できますsort

printf '%b' 'a b f\nd e c\ng h' | sort -k 3

出力は

g h
d e c
a b f

このsortコマンドでは、次のオプションを使用して非標準のフィールド区切り文字を使用することもできます-t

printf '%b' "a;b;f\nd;e;c\ng;h" | sort -k 3 -t ';'

出力は

g;h
d;e;c
a;b;f

しかし、レコード区切り文字以外の文字を使用してテーブルを並べ替える方法を見つけることができませんでしたnewline

これは実現可能でしょうか? もし可能であれば、どのように実現するのでしょうか?

編集

重要な条件は、プロセス中にデータも区切り文字も変更せず、それらの表示順序のみを変更することです。

コマンド以外のツールもsortOK です。POSIX 準拠が望ましいですが、必須ではありません。

答え1

ソートコマンドは、マニュアルに記載されているように、改行またはNUL文字で区切られた入力レコードのみをソートできます。

ソートユーティリティは、テキストファイルとバイナリファイルを行ごとにソートします。行とは、改行(デフォルト)またはNUL '\0'文字で後続のレコードから区切られたレコードです。

したがって、変換のどこかの時点で、望ましい結果を得るためにレコード区切り文字(あなたの場合)の知識が必要になります|。他のコマンド(Awk/Perlまたはdatamash)では、この仮定を行う必要があります。


単一のスタンドアロンツールではなく、とを使用するtrと、sortパイプpasteラインにコマンドを1つずつ追加することで、変換がどのように形作られるかを確認できます。

echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -

関連情報