Bashで改行ではなくレコード区切り文字を使用した表のソート

Bashで改行ではなくレコード区切り文字を使用した表のソート

次の表があります。

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

3番目の列に基づいてソートしたいです。出力は次のようになります。

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

whitespace標準区切り記号を使用するには、newline次のように実行できます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ただし、レコードではなく区切り文字を使用してテーブルをソートする方法が見つかりませんでした。

これは達成できますか?それでは、どうすればいいですか?

編集する

主な条件は、プロセス中にデータや区切り文字が変更されず、表示される順序のみが変更されることです。

コマンドに加えて、他のツールsortも使用できます。 POSIX 準拠が優先されますが、必須ではありません。

ベストアンサー1

sortコマンドは、マニュアルに示されているように、改行または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'|' -

おすすめ記事