Bagaimana cara mengurutkan angka berdasarkan kolom terakhir?

23

Saya punya input ini:

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

Saya butuh hasil ini:

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

Jadi saya perlu mengurutkan garis dengan kolom terakhir.

Saya tidak tahu berapa banyak kolom dalam satu baris.

Aku hanya tidak tahu, bagaimana melakukannya. Saya tidak memiliki "kekuatan perl". Saya hanya punya ~ rata kekuatan scripting dengan sed, awk, cut, dll.

Apakah ada yang tahu cara melakukannya?

LanceBaynes
sumber

Jawaban:

34

Baris perintah berikut digunakan awkuntuk menambahkan bidang terakhir dari setiap baris file.txt, melakukan pembalikan angka numerik, lalu menggunakan cutuntuk menghapus bidang yang ditambahkan:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
forcefsck
sumber
omg ... saya tidak tahu tentang $ RS !! Terima kasih banyak!!!!!
LanceBaynes
@ Forcefsck: Saya rasa tidak mungkin hanya dengan itu sort -k. The begfieldfungsi dalam GNU semacam hanya menghitung mundur ke nol. Pendekatan menghias-sort-undecorate (DSU) Anda tampaknya menjadi cara terbaik yang saya pikirkan.
Mikel
Karena minat, mengapa $NF,$RSdan tidak $NF,$0? Saya tidak tahu $RSmelakukannya. (Saya kira itu setara dengan $NF,$"\n", yang melakukan hal yang sama, tetapi saya kira juga mengejutkan.)
Mikel
2
@ johnny8888, @forcefsck: Dalam awk, $dapat diikuti oleh ekspresi apa pun. " Efek dari ekspresi nomor bidang mengevaluasi apa pun selain bilangan bulat non-negatif tidak ditentukan ". GNU awk (pada sistem saya) memperlakukan string seperti "\n"nol. Lainnya (mis. Implementasi asli oleh A, W dan K) dibatalkan dengan pesan kesalahan. Jika RSkebetulan digit, Anda akan mendapatkan bidang yang sesuai pada implementasi apa pun. Jadi jangan lakukan ini, gunakan $0.
Gilles 'SO- berhenti bersikap jahat'
1
Sangat rapi! Jadi penjelasan panjang tentang apa yang terjadi: dengan awk, cetak bidang terakhir terlebih dahulu kemudian seluruh catatan, urutkan terbalik secara numerik, lalu pangkas kolom pertama menggunakan potongan.
phyatt