gunakan penyortiran GNU untuk mengurutkan berdasarkan satu kunci / mencegah penyortiran yang tidak diinginkan dari kunci lainnya

9

Saya memiliki file yang berisi data yang sudah dipesan dan saya ingin memesan ulang file sesuai dengan nilai-nilai di satu kunci, tanpa merusak urutan data di kunci lain.

Bagaimana cara mencegah penyortiran GNU dari melakukan penyortiran baris berdasarkan pada nilai kunci yang belum saya tentukan, atau bagaimana cara saya menentukan penyortiran GNU untuk mengabaikan serangkaian kunci saat menyortir?

File data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

Output yang diharapkan:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Perintah:

sort -k 1,1 <data.txt

Hasil: penyortiran yang tidak diinginkan yang tidak saya minta:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C
Wil
sumber

Jawaban:

21

Anda perlu jenis yang stabil . Dari man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

yaitu.:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Perhatikan bahwa Anda mungkin juga menginginkan -natau --numeric-sortjika kunci Anda numerik (misalnya, Anda mungkin mendapatkan hasil yang tidak terduga ketika membandingkan 10 hingga 2 dengan urutan default - lexical - sort). Dalam hal ini hanya masalah melakukan:

sort -sn <data.txt

Tidak perlu mengekstrak bidang pertama karena interpretasi numerik dari seluruh baris akan sama dengan salah satu bidang pertama.

Steeldriver
sumber
Saya membaca dokumen tetapi definisi yang tepat "stabil" mengelak dari perhatian saya. Terima kasih atas respons yang cepat, singkat, dan dikutip dengan baik. Kunci pertama data nyata adalah string terlokalisasi, jadi numerik tidak akan bekerja untuk saya.
Wil
4

Untuk sortimplementasi (non-GNU) yang tidak memiliki -sopsi, Anda selalu dapat melakukan:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

Artinya, tambahkan nomor baris untuk menjadikannya tombol sortir kedua, dan cabut setelahnya.

Stéphane Chazelas
sumber