最後の列で数値を並べ替える方法は?


23

私はこの入力があります:

sdkxyosl 1
safkls 2
asdf--asdfasxy_asd 5
dkd8k  jasd 29
sdi44sw 43
asasd afsdfs 10
rklyasd 4

この出力が必要です:

sdi44sw 43
dkd8k  jasd 29
asasd afsdfs 10
asdf--asdfasxy_asd 5
rklyasd 4
safkls 2
sdkxyosl 1

だから私は最後の列で行をソートする必要があります。

1行にいくつの列があるかわかりません。

どうしたらいいか分からない。「perl powers」を持っていません。〜sed、awk、cutなどの平均的なスクリプト機能があります。

誰かがそれを行う方法を知っていますか?

回答:


34

次のコマンドラインはawk、file.txtの各行の最後のフィールドの前に使用し、逆の数値ソートを実行してcutから、追加したフィールドを削除するために使用します。

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '

ああ...私は$ RSについて知らなかった!! どうもありがとうございました!!!!!
ランスベインズ

@forcefsck:でのみ可能だとは思わないsort -kbegfieldGNUソートの関数は、ゼロまでカウントダウンします。あなたのデコレート-ソート-アンデコレート(DSU)アプローチは、私が考える最高の方法のようです。
ミケル

興味が$NF,$RSない、なぜ$NF,$0ですか?私はそれを知りません$RSでした。($NF,$"\n"これはに相当しますが、同じことをしていると思いますが、それはまた驚くべきことです。)
Mikel

2
@ johnny8888、@ forcefsck:awkでは、$任意の式を続けることができます。「フィールド番号式が負でない整数以外に評価されることの効果は不特定です」GNU awk(私のシステム上)は、文字列"\n"をゼロのように扱います。その他(A、W、Kによる元の実装など)はエラーメッセージで中断します。場合RSの数字であることを起こった、あなたはどのような実装に対応するフィールドを取得したいです。だから、これをしないでください$0
ジル「SO-悪であるのをやめる」

1
本当にすてき!何が起こっているのかという長い説明:awkでは、最後のフィールドを最初に印刷し、次にレコード全体を印刷し、逆の数値でソートし、次にcutを使用して最初の列を切り取ります。
phyatt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.