Bagaimana cara UNIX mengurutkan berdasarkan satu kolom saja?

47

Saya tahu bahwa opsi -k untuk jenis Unix memungkinkan kami untuk mengurutkan berdasarkan kolom tertentu dan semua berikut ini . Misalnya, diberikan file input:

2 3
2 2
1 2
2 1
1 1

Dengan menggunakan sort -n -k 1, saya mendapatkan output yang diurutkan berdasarkan kolom 1 dan kemudian oleh 2:

1 1
1 2
2 1
2 2
2 3

Namun, saya ingin tetap memesan kolom ke-2, seperti ini:

1 2
1 1
2 3
2 2
2 1

Apakah ini mungkin dengan sortperintah?

ssn
sumber

Jawaban:

65

Cobalah ini:

sort -s -n -k 1,1

The -smenonaktifkan 'terakhir resor' menyortir, yang macam pada segala sesuatu yang bukan bagian dari kunci tertentu.

The -k 1tidak benar-benar berarti "bidang ini dan semua berikut" dalam konteks semacam numerik, seperti yang Anda lihat jika Anda mencoba untuk menyortir pada kolom kedua. Anda hanya melihat ikatan rusak dengan pergi ke seluruh baris. Namun secara umum, Anda perlu menentukan -k 1,1untuk mengurutkan hanya pada bidang satu.

Cascabel
sumber
Kamu benar. Inilah yang saya butuhkan. Terima kasih!
Apakah mungkin menggunakan join pada output semacam ini?
MiNdFrEaK
@MiNdFrEaK: Syaratnya joinadalah input diurutkan pada bidang yang Anda ikuti . Jadi yakin, output ini diurutkan pada bidang pertama, dan Anda dapat bergabung di sana.
Cascabel
Saya memiliki 2 file, satu memiliki 2 kolom, yang lain memiliki 1 kolom. File kedua diurutkan menggunakan sort -u. Sekarang tugasnya adalah saya harus bergabung dengan kolom ini dengan kolom pertama dari file pertama, yang tidak diurutkan, jadi apa yang akan menjadi sintaks? apakah ini akan berhasil? gabung -j 1 jenis file2.txt -s -n -k 1 file1.txt?
MiNdFrEaK
1
Bagian -k 1,1(" 1 ") tidak berfungsi lebih baik untuk saya. Apa yang berhasil adalah -s -k 1, dengan -njika Anda membutuhkannya.
Totor
10

Untuk hanya mengurutkan pada kolom pertama yang harus Anda lakukan:

sort -n -s -k1,1

Dari Buku Pegangan Administrasi Sistem Unix dan Linux

sort menerima spesifikasi kunci -k3 (bukan -k3,3), tetapi mungkin tidak melakukan apa yang Anda harapkan. Tanpa nomor bidang penghentian, tombol sortir berlanjut ke akhir baris

tidbeck
sumber
Tidak bekerja untuk saya, saya perlu menambahkan -sopsi seperti yang ditunjukkan Cascabel.
Jean Paul
@JeanPaul Anda benar, dokumentasi untuk -smengatakan "Opsi ini mempertahankan urutan rekaman asli dari catatan yang memiliki kunci yang sama."
tidbeck
2

Tidak satu pun dari jawaban yang diberikan bekerja secara umum untuk saya.

Keduanya sort -s -k 2 file1dan sort -n -k1,1lakukan pengurutan tambahan dengan file ini:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Saya hanya harus melakukan hal yang tepat ini dan akhirnya menggunakan lingkaran shell. Solusi ini mungkin tidak berfungsi dengan baik pada file yang sangat besar karena seluruh file perlu dibaca untuk setiap nilai unik di kolom diurutkan.

Di sini file diurutkan pada kolom 2 saja.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7
pengguna680341
sumber
sort -s -k2,2 file1
plhn
Jawaban yang diajukan oleh Cascabel berfungsi tetapi saya pikir Anda salah membaca.
Jean Paul