Anda dapat menggunakan beberapa -kbendera untuk mengurutkan di lebih dari satu kolom. Misalnya, untuk mengurutkan berdasarkan nama keluarga lalu nama depan sebagai pemecah ikatan:
sort -k 2,2 -k 1,1 file.txt
Opsi yang relevan dari "man sort":
-k, --key = POS1 [, POS2]
mulai kunci di POS1, akhiri di POS2 (asal 1)
POS adalah F [.C] [OPTS], di mana F adalah nomor field dan C adalah posisi karakter di field. OPTS adalah satu atau lebih opsi pemesanan satu huruf, yang menggantikan opsi pemesanan global untuk kunci itu. Jika tidak ada kunci yang diberikan, gunakan seluruh baris sebagai kunci.
Berhati-hatilah saat menggunakan --field-separator=','jika Anda mungkin memiliki operator entri data yang memasukkan nilai untuk "Nama depan" seperti "Billy Bob" atau apa pun ... spasi dapat dengan mudah masuk ke data Anda jika Anda tidak melindunginya, tetapi koma relatif tidak mungkin.
Tony Delroy
1
Ada kemungkinan besar kasus koma di bidang tersebut, seperti "Smith, Jr." atau "McDowell, Sr." atau "Dr. John" atau "New York, NY"
jbnunn
2
Perhatikan bahwa jika kolom sejajar secara visual, yaitu ada jumlah spasi yang tidak konstan di antara setiap bidang, Anda harus menggunakan -bopsi. Ini karena sortsebenarnya mempertimbangkan bahwa string yang akan diurutkan dimulai tepat setelah koma, dan bukan dari huruf pertama kolom. Selain itu, Anda mungkin perlu memberi awalan perintah dengan LC_ALL=C, untuk menghindari efek samping apa pun karena lokal, yang dapat terjadi bahkan pada file ASCII sederhana.
calandoa
@calandoa Terima kasih untuk bagian di -b( --ignore-leading-blanks). Untuk memperjelas sedikit: echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2memberi a<SPACE><SPACE>bpertama (kolom kedua dimulai setelah yang pertama non-blank to blank transition, dan <SPACE><SPACE>bsebelum <SPACE>a), tetapi dengan -bitu memberi aa<SPACE>aseperti yang diharapkan ( asebelum b).
Kirill Bulygin
7
Untuk mengurutkan berdasarkan bidang kedua saja (dengan demikian jika bidang kedua cocok, baris yang cocok tetap dalam urutan aslinya tanpa mengurutkan di bidang lain):
Jawaban:
Jika ini UNIX:
Anda dapat menggunakan beberapa
-k
bendera untuk mengurutkan di lebih dari satu kolom. Misalnya, untuk mengurutkan berdasarkan nama keluarga lalu nama depan sebagai pemecah ikatan:Opsi yang relevan dari "man sort":
sumber
--field-separator=','
jika Anda mungkin memiliki operator entri data yang memasukkan nilai untuk "Nama depan" seperti "Billy Bob" atau apa pun ... spasi dapat dengan mudah masuk ke data Anda jika Anda tidak melindunginya, tetapi koma relatif tidak mungkin.-b
opsi. Ini karenasort
sebenarnya mempertimbangkan bahwa string yang akan diurutkan dimulai tepat setelah koma, dan bukan dari huruf pertama kolom. Selain itu, Anda mungkin perlu memberi awalan perintah denganLC_ALL=C
, untuk menghindari efek samping apa pun karena lokal, yang dapat terjadi bahkan pada file ASCII sederhana.-b
(--ignore-leading-blanks
). Untuk memperjelas sedikit:echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2
memberia<SPACE><SPACE>b
pertama (kolom kedua dimulai setelah yang pertamanon-blank to blank transition
, dan<SPACE><SPACE>b
sebelum<SPACE>a
), tetapi dengan-b
itu memberiaa<SPACE>a
seperti yang diharapkan (a
sebelumb
).Untuk mengurutkan berdasarkan bidang kedua saja (dengan demikian jika bidang kedua cocok, baris yang cocok tetap dalam urutan aslinya tanpa mengurutkan di bidang lain):
sumber
FWIW, berikut adalah metode pengurutan untuk menunjukkan proses mana yang menggunakan memori paling baik.
memstat | sort -k 1 -t':' -g -r | less
Opsi pengurutan diatur ke kolom pertama, menggunakan: sebagai pemisah kolom, pengurutan numerik dan urutkan secara terbalik.
sumber
Karenanya Anda dapat mengubah nomor kolom.
sumber