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.

pengguna2452340
sumber
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.

jaypal singh
sumber
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/^.* //'
    
pengguna3781670
sumber
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
Diego Roberto Dos Santos
sumber
9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

dan untuk urutan terbalik

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

coba ini -

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

ATAU

sort -t',' -nk3 user.csv
VIPIN KUMAR
sumber
2
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

Ini seharusnya berhasil

pengguna13608932
sumber
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"}'
rupert160
sumber