Menyortir data berdasarkan kolom kedua file

213

Saya memiliki file dua kolom dan njumlah baris.

kolom 1 berisi namesdan kolom2 age.

Saya ingin mengurutkan konten file ini dalam urutan menaik berdasarkan pada age(di kolom kedua).

Hasilnya harus menampilkan orang nametermuda bersama namedan kemudian orang termuda kedua dan seterusnya ...

Setiap saran untuk skrip shell atau bash satu kapal.

Angelo
sumber
1
Superset: pembatas khusus: stackoverflow.com/questions/1037365/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

330

Anda dapat menggunakan sortperintah :

sort -k2 -n yourfile

-n, --numeric-sortbandingkan menurut nilai numerik string

Sebagai contoh:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54
Matt Ryall
sumber
1
juga perhatikan bahwa menggunakan -halih-alih -nakan mengurutkan nilai yang dapat dibaca manusia seperti 2Gatau 3Kjuga angka yang dipisahkan dengan koma misalnya1,234.5
chillitom
Menghadapi masalah dengan pemesanan "salah". Perhatikan pria "*** PERINGATAN *** Lokal yang ditentukan oleh lingkungan memengaruhi urutan sortir. Atur LC_ALL=Cuntuk mendapatkan urutan sortir tradisional yang menggunakan nilai byte asli." (untuk case match string tanpa -n)
x'ES
Ini tidak menganggap spasi di kolom pertama tidak berfungsi jika ada lebih banyak kolom setelah kolom kedua, karena -k membaca hingga baris berakhir. Misalkan itu adalah file TSV solusi yang lebih baik adalahsort -t$'\t' -k2 -n FILE
tuxErrante
Anda mungkin perlu menentukan pembatas Anda menggunakan opsi -t
spectrum
85

Larutan:

sort -k 2 -n filename

lebih banyak tertulis sebagai:

sort --key 2 --numeric-sort filename


Contoh:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Penjelasan:

  • -k # - argumen ini menentukan kolom pertama yang akan digunakan untuk mengurutkan. (perhatikan bahwa kolom di sini didefinisikan sebagai bidang dibatasi spasi putih; argumen -k5akan mengurutkan dimulai dengan bidang kelima di setiap baris, bukan karakter kelima di setiap baris)

  • -n - opsi ini menentukan "jenis numerik" yang berarti kolom harus ditafsirkan sebagai deretan angka, bukan teks.


Lebih:

Pilihan umum lainnya termasuk:

  • -r - opsi ini membalik urutan penyortiran. Itu juga dapat ditulis sebagai --reverse .
  • -i - Opsi ini mengabaikan karakter yang tidak dapat dicetak. Itu juga dapat ditulis sebagai --ignore-nonprinting .
  • -b - Opsi ini mengabaikan spasi kosong awal, yang berguna karena spasi putih digunakan untuk menentukan jumlah baris. Itu juga dapat ditulis sebagai --ignore-leading-blanks .
  • -f - Opsi ini mengabaikan huruf besar. "A" == "a". Itu juga dapat ditulis sebagai --ignore-case .
  • -t [pemisah baru] - Opsi ini membuat preprocessing menggunakan operator selain ruang. Itu juga dapat ditulis sebagai --field-separator .

Ada pilihan lain, tetapi ini adalah yang paling umum dan bermanfaat, yang sering saya gunakan.

DCurro
sumber
@ Angelo Jawaban ini mungkin diposting bertahun-tahun setelah Anda menerima jawaban untuk pertanyaan ini, tetapi apakah Anda menganggapnya sebagai jawaban yang baru diterima?
Jonathan Y.
Opsi -tadalah penyelamat kehidupan nyata !! ketika kolom Anda memiliki spasi dan kolom berbeda dengan karakter yang diberikan seperti ,atau tab
AKS
12

Untuk nilai yang dipisahkan tab, kode di bawah ini dapat digunakan

sort -t$'\t' -k2 -n

-r dapat digunakan untuk mendapatkan data dalam urutan menurun.
-n untuk pengurutan numerik
-k, --key = POS1 [, POS2] di mana k adalah kolom dalam file
Untuk urutan menurun di bawah ini adalah kode

sort -t$'\t' -k2 -rn
Saurabh
sumber
4

Gunakan sort.

sort ... -k 2,2 ...
Ignacio Vazquez-Abrams
sumber
8
Anda juga perlu menggunakan -n untuk mengurutkan berdasarkan usia (jenis numerik). Kalau tidak '11' akan datang sebelum '2'.
Matt Ryall