Saya memiliki beberapa perintah dalam skrip awk yang saya tulis:
print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2}
Output yang mana:
Here are some players and their numbers, sorted by last name
Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55
Bagaimana saya bisa menggunakan sort
perintah dalam skrip awk saya untuk mengurutkan para pemain dan jumlah mereka SAJA?
command-line
text-processing
awk
KM142646
sumber
sumber
x
, lalu setelPROCINFO["sorted_in"]
ke nilai samar, kemudian output array. Saya tidak akan pergi ke sana.... | sort -k2,2
....| sort -k2,2
jika ada jalur lain yang perlu dicetak? Periksa pertanyaan yang diedit.echo
-ing baris header dari shell, lalu jalankanawk | sort
pipeline.Jawaban:
Anda dapat menambah
| sort -k2
perintah Anda. Ini akan mengurutkan berdasarkan abjad pada kolom kedua.Contoh:
hasil dalam
sumber
{print x, $2}
langsung dalam kode skrip? Saya mendapat pesan kesalahan saat melakukan perpipaanif(sum[x] > 500) {print x, $2} | sort -k2
.if(sum[x] > 500) {print x, $2}
adalah kode awk sementara| sort -k2
adalah perintah shell. Jelas Anda tidak dapat mencampur keduanya seperti itu karena mereka bahasa yang berbeda. Alih-alih, Anda perlu menerapkansort
perintah ke output penerjemah Awk yang menjalankan cuplikan kode Awk Anda. Jika Anda tidak tahu apa yang saya maksud, perluas pertanyaan Anda untuk memberi kami gambaran lengkap../my-script.sh | sort -k2
. 2. tambahkan `| sort -k2` ke baris skrip Anda yang menghasilkan output yang diberikan dalam pertanyaan Anda.Meskipun saya tidak akan merekomendasikannya (mengingat kesederhanaan relatif dari memipipkan hasilnya melalui
sort
perintah eksternal ) Anda dapat melakukan ini setidaknya dengan versi terbaru dari GNU awk (minimal 4.0 IIRC), seperti yang dijelaskan pada Sorting Array Values and Indices with gawkInilah cara Anda dapat mengimplementasikannya, dengan asumsi Anda memiliki data dalam array asosiatif di mana indeks berada
Firstname Lastname
. Pertama, Anda perlu mendefinisikan fungsi perbandingan khusus yang membagi indeks, membandingkan pertamaLastname
lalu (sebagai tie breaker) padaFirstname
misalnyaSekarang Anda dapat menggunakan
PROCINFO["sorted_in"]
metode pengurutan array yang disebutkan dalam komentar oleh @zwetsMenyatukannya
Pengujian:
Dalam versi awk yang lebih kecil atau lebih lama, taruhan terbaik Anda mungkin adalah menyimpan data yang diindeks dengan
Lastname Firstname
, mengurutkan dengan yang konvensionalasorti
, lalu membagi dan menukar bidang indeks saat Anda melintasi array untuk mencetaknya:sumber
Untuk
sort
hanya dengan bidang kedua yang dipisahkan spasi, gunakan kunci-k2,2
:secara default
sort
melakukan penyortiran leksikografis.Perhatikan bahwa, jika Anda tidak menyebutkan bidang terakhir untuk kunci pengurutan yaitu jika Anda hanya menggunakan
-k2
maka Anda mungkin tidak mendapatkan hasil yang diinginkan karena ini akansort
sesuai dengan semua bidang mulai dari yang kedua.Periksa juga
man sort
.sumber
Mencoba
Di mana myscript.awk berisi perintah murni awk.
Jika skrip aktual Anda adalah skrip shell, Anda memiliki beberapa opsi termasuk
./myscript.bash | sort -k2
Menulis ulang kode sebagai fungsi di dalam naskah
Alih-alih
Melakukan
Tetapi perhatikan, Anda juga dapat menerapkan struktur semacam itu pada do ... done daripada membuat fungsi.
sumber
Untuk mengurutkan data Anda untuk dicetak:
Misalkan Anda ingin mencetak bidang ke-2 (dipisahkan spasi) gunakan ini:
misalnya:
Jika Anda ingin mencetak keseluruhan
data.txt
tetapi diurutkan pada kolom 2, maka:Gunakan logika ini dalam kebutuhan Anda.
Anda dapat menggunakan
man sort
untuk fitur yang lebih menarik darisort
.sumber
bagaimana dengan di bawah ini:
ini bekerja ketika saya diuji.
sumber
Untuk mengurutkan output ke file:
sumber