Cara menggunakan awk sort by column 3


90

Saya memiliki file (user.csv) seperti ini

ip,hostname,user,group,encryption,aduser,adattr

ingin mencetak semua kolom urutkan berdasarkan pengguna,

Saya mencoba awk -F ":" '{print|"$3 sort -n"}' user.csv, itu tidak berhasil.


11
sort -t, -k3 file
Kevin

Jawaban:


174

Bagaimana dengan adil sort.

sort -t, -nk3 user.csv

dimana

  • -t,- mendefinisikan pembatas Anda sebagai ,.

  • -n- memberi Anda urutan numerik. Ditambahkan sejak Anda menambahkannya dalam upaya Anda. Jika bidang pengguna Anda hanya teks maka Anda tidak membutuhkannya.

  • -k3- mendefinisikan bidang (kunci). pengguna adalah bidang ketiga.


2
Bagaimana cara menggunakan sortir 2 kolom? misalnya, saya ingin mengurutkan menurut kolom 6 terlebih dahulu, dan mengurutkan menurut kolom 3 detik.
pengguna2452340

1
Ini tidak akan berfungsi jika ada kutipan string yang berisi koma di CSV (kecuali kolom yang ingin Anda urutkan lebih awal dari kolom yang berisi koma). Anda mungkin harus membuat operan terlebih dahulu dengan awk (menggunakan FPAT = "[^,] * | \" [^ \ "] * \" "dan OFS =" | "atau pembatas lain yang dapat Anda gunakan dengan sort)
davemyron

1
@ user2452340 Anda dapat melakukan ini: sort -t, -nk3 filename.csv | sort -t, -nk6- pertama-tama akan mengurutkan berdasarkan kolom 3, kemudian akan mengurutkannya berdasarkan kolom 6 sehingga kolom 6 diurutkan dengan benar sepenuhnya dan untuk setiap baris yang kolom 6 sama, itu akan diurutkan berdasarkan kolom 3 .
Matius

3
@ Matius sort -t ',' -k3,3n -k6,6nakan lebih baik. -k3akan menggunakan kolom 3 dan sisa baris.
Kusalananda

1
Saya hanya perlu -t, untuk membagi file 2 kolom saya dibagi dengan koma, terima kasih jaypal
Ricardo Rivera Nieves

20
  1. Gunakan awk untuk menempatkan ID pengguna di depan.
  2. Menyortir
  3. Gunakan sed untuk menghapus ID pengguna duplikat, dengan asumsi ID pengguna tidak mengandung spasi.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

Ini sangat berguna, terutama jika Anda perlu mengurai atau menggabungkan kolom untuk menambahkan kolom pengurutan, lalu pertahankan hanya baris aslinya. Saya menggunakan awk / split untuk mengurai / menggabungkan bidang tanggal & waktu untuk mengurutkan, lalu menghapus.
skytaker

1
sortsudah mengetahui cara mengurutkan berdasarkan kolom tertentu, tetapi teknik ini - yang dikenal sebagai transformasi Schwartzian - berguna jika bidang yang ingin Anda sortir bukan merupakan kolom yang terdefinisi dengan baik.
tripleee

10

Anda dapat memilih pembatas, dalam hal ini saya memilih titik dua dan mencetak kolom nomor satu, mengurutkan berdasarkan urutan abjad:

awk -F\: '{print $1|"sort -u"}' /etc/passwd

9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

dan untuk urutan terbalik

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 

6

coba ini -

awk '{print $0|"sort -t',' -nk3 "}' user.csv

ATAU

sort -t',' -nk3 user.csv


0

Untuk mengecualikan baris pertama (header) dari pengurutan, saya membaginya menjadi dua buffer.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
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.