Menyortir file berdasarkan kolom pertama dan kemudian kedua


13

Bagaimana saya bisa memanipulasi file teks dua kolom yang dipisahkan tab dengan mengurutkan berdasarkan elemen pertama dari kolom kedua (hanya jika elemen kolom pertama sama)?

Contoh:

Input File 1

A   1-2
A   6-8
A   3-4
B   7-10
B   5-9

Output yang diharapkan: File 2

A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

Jawaban:


22

Gunakan sort's -kpilihan untuk mengurutkan berdasarkan (beberapa) kolom sekaligus:

$ sort -k1,1 -k2n input
A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

-k1,1mengurutkan berdasarkan kolom pertama terlebih dahulu, kemudian -k2ndengan kedua¹ secara numerik ketika kolom pertama diikat, sehingga Anda mendapatkan output sesuai urutan yang Anda inginkan: mengurutkan berdasarkan elemen pertama dari kolom kedua, hanya jika elemen kolom pertama sama.

Saat mengurutkan secara numerik, ia hanya akan memeriksa bidang sampai berhenti menjadi angka, sehingga memberi Anda perbandingan elemen pertama saja.

Ketika dua kunci membandingkan yang sama, kemudian sortmembandingkan garis penuh secara leksikal sebagai perbandingan terakhir. Misalnya dalam A 1-10vs A 1-2, kunci pertama identik ( Astring), dan kunci kedua juga (keduanya diperlakukan sebagai angka 1), jadi kemudian sortmembandingkan A 1-10vs A 1-2leksikal dan yang terakhir lebih besar sebagai 2jenis setelah 1. Implementasi GNU sortmemiliki -Vopsi atau Vflag kunci untuk melakukan pengurutan versi , yang seperti perbandingan leksikal kecuali bahwa urutan angka desimal dalam string dibandingkan secara numerik, jadi sort -k1,1 -k2Vakan mengurutkan A 1-10setelah A 1-2karena 10angka lebih besar dari 2.


¹ secara teknis, -k2berarti bagian dari garis yang dimulai dengan bidang kedua (setelah transisi pertama dari non-kosong ke kosong) dan berakhir pada akhir baris, tetapi dengan nbendera, itu setara dengan -k2,2nhanya sebagai bagian utama yang merupakan angka dianggap.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.