次のようなテーブルがあります
'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
OK です。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'|' -