
私は次の出力を得るためにスクリプト(私が制御できない)を実行しています。最後の(3 番目の)列で並べ替えたいです。各列はスペースで区切られており、2 番目の列にはスペース/記号が含まれています。
> ./script
37622 (this is || test1)&&(SGD||HKD||RMB) 40010
43944 (this is)&&(SGD||HKD) 102732
79378 (this is||test2)&&(HKD||RMB) 205425
457000 (test2) && (SGD||RMB||HKD||YEN) 71
559658 (test1||test2)&&(RMB||YEN||SGD) 14043
sort -k を使ってみましたが、うまくいきませんでした。そこでこの質問を見つけました -最後の列で数値を並べ替えるにはどうすればいいですか?- 提供される解決策は
awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
私の質問は、スクリプトを実行するときにこれをどのように活用するかということです。
> ./script | <something??>
ありがとう。
答え1
ぎこちない
リンクされたパイプは簡単な方法で適応できます:
$ ./script | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '
awk
式では$x
、現在の行の x 番目の列 (1 から始まる) を参照し、定義済み変数にはNF
現在の行の列数が格納されているため、print $NF,$0
各行の最後の列と完全な行 ( は$0
完全な行を表すため) が出力されます。cut
次に、コマンドは各行の 2 列目から最後の列までを出力します。
ソートの部分-k1,1
は、最初の列のみがソート キーとして使用されることを意味します。これは、最初の列に複数の行が同じ値を持つ場合にのみ違いが生じます。-k1,1
その場合、後続の列がないと、相対順序 (セカンダリ ソート キーなど) に影響します。-k1,1
最初の列のみがソート キーとして使用され、同じキーを持つ行の相対順序は変更されません (つまり、安定したソートが実行されます)。
sed
sort
あるいは、およびで解決することもできますsed
:
$ ./script | sed 's/^\(.\+[ \t]\+\)\([0-9]\+ *\)$/\2 \1/' | \
sort -k1,1 -n | sed 's/^\([0-9]\+\) \(.\+\)$/\2 \1/'
最初の行の末尾の改行が - によってエスケープされている場合は、それを削除してパイプを 1 行として入力でき\
ます。\
アイデアとしては、まず最後の列を最前列に移動し、最初の列で並べ替えてから、再び最後尾に配置するというものです。
最後の列は空白[ \t]\+
(スペースまたはタブ) で区切られているものと想定されます。
式sed
はグループ参照 (例 ) を介してスワップを実行します\2 \1
- グループはエスケープされた括弧を介してパターン内でマークされます:\(...\)