次の表があります。
'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'|' -