Pisahkan file input menjadi tiga kolom dan urutkan berdasarkan kolom ketiga [ditutup]

0

Sejauh ini saya memiliki skrip saya (script.sh) sebagai:

#!/bin/bash/

BEGIN {  
        print "Author    Name of Book     ISBN"  
        print "------    ------------     ----"  
}  
{ printf "%-9s &s\n", 1$, 2$, 3$ }  
END  

Lalu saya menjalankan perintah:

sort -k 3,3 INPUTFILE.INPUT | awk -f script.sh  

Tidak ada yang berfungsi sesuai kebutuhan.

Juga sebagai catatan, file input memiliki data yang dipisahkan oleh koma. Saya juga harus menggunakan "loop" yang saya harap perintah awk lakukan.

T13
sumber
Pertama, shebang Anda seharusnya #!/bin/bash. Garis miring trailing akan menunjukkan direktori /bin/bash/dan bukan bashexecutable. Berikan sampel data dalam `INPUTFILE.INPUT, output yang Anda dapatkan, dan output yang Anda harapkan. Hampir tidak mungkin memecahkan masalah tanpa informasi ini.
Nasir Riley
@NasirRiley Saya tidak berpikir masalah shebang di sini - karena OP menyerahkan semuanya ke awk -f(yang hanya akan memperlakukannya sebagai komentar)
steeldriver
Hai ya maaf. File input memiliki 7 baris. Contoh; penulis, nama buku, isbn
T13
@trevor Berikan kami contohnya. Apa output yang Anda dapatkan dan apa yang diharapkan?
Nasir Riley
saya mendapatkan kesalahan sintaksis dalam skrip saya di mana koma memisahkan 1 $, 2 $, 3 $
T13

Jawaban:

1

Ada beberapa masalah di sini, beberapa yang akan menghasilkan kesalahan, dan yang lainnya hanya kesalahan ketik atau hasil dari kesalahpahaman:

  1. The #!-line dapat dihapus, atau harus mengatakan

    #!/usr/bin/awk -f

    (atau apa pun lokasi awkberada di sistem Anda). Dengan garis di atas #!, Anda tidak harus memanggil skrip dengan awk -fpada baris perintah tetapi bisa menggunakan ./script.awksecara langsung, jika dapat dieksekusi. Dengan no- #!line, Anda harus menggunakan awk -fbaris perintah.

  2. Untuk referensi nilai dalam bidang tertentu dalam data input, gunakan di $nmana nnomor bidang yang Anda maksudkan, bukan n$.

  3. The printfstring format hanya memiliki satu format placeholder, tapi Anda memberikan tiga lembar data. Ia juga tidak memiliki tanda kurung di sekitar argumennya.

  4. The ENDblok dapat dihapus.

  5. Jika input memiliki pembatas bidang seperti ,atau |bukannya dibatasi pada spasi putih (spasi atau tab), Anda harus memberi tahu awktentang hal ini dengan menggunakan misalnya awk -F ','atau awk -F '|', atau dengan mengatur variabel FSke karakter yang sesuai dalam BEGINblok. Kalau tidak, skrip akan membagi catatan input salah.

Ini memberi kita skrip ( script.awk):

BEGIN {
    fmt = "%-15s\t%-15s\t%-15s\n"
    printf(fmt, "Author", "Name of Book", "ISBN")  
    printf(fmt, "------", "------------", "----")  
}

{ printf(fmt, $1, $2, $3) }

Saya mengambil kebebasan untuk memperkenalkan string format yang memformat masing-masing dari tiga bidang yang dibatasi-tab sebagai string yang dibenarkan kiri. Setiap bidang mendapat ruang 15 karakter. Anda dapat dengan mudah men-tweak ini dengan mengubah fmtdi BEGINblok.

Doa itu akan

sort -t ',' -k 3,3 INPUTFILE.INPUT | awk -F ',' -f script.awk

Di sini, diasumsikan bahwa data dalam file dipisahkan koma (dan sortperintah telah diubah sesuai).

Kusalananda
sumber