次の出力を得るために制御できないスクリプトを実行しています。最後(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
)を通じて交換されます。グループは括弧をエスケープしてパターンに表示されます。\(...\)