Saya punya file cities
seperti ini:
[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)
Saya ingin memotong nama kota, sehingga saya memiliki:
San Diego
St Louis
Orlando
Ini yang terbaik yang bisa saya pikirkan:
cut -d ',' -f1 cities | cut -d ']' -f2
Tapi itu masih memberi saya ruang sebelum nama. Apakah ada cut
perintah sejenis yang bisa saya gunakan yang menerima pembatas beberapa karakter sehingga saya bisa memotong ]
?
command-line
cut
Kit Sunde
sumber
sumber
tr
berguna untuk menghapus karakter yang tidak Anda inginkan.(inactive)
statusnya atau tidak? Harap berikan output sampel.cut
untuk memotong sesuatu dan Anda dapat melihat maksud dari contoh gagal yang saya miliki, itu harus cukup jelas dalam konteksnya. Saya akan memberikan sampel meskipun untuk menjernihkannya lebih lanjut. :)Jawaban:
Awk (juga periksa Awk Info ) cantik dengan pertanyaan seperti itu. Mencoba:
Ini mendefinisikan pemisah bidang
-F
sebagai[],] *
- yang berarti satu kemunculan dari kurung siku penutup atau koma, diikuti oleh nol atau sejumlah spasi. Tentu saja Anda dapat mengubahnya agar sesuai dengan persyaratan apa pun. Baca dengan ekspresi reguler.Setelah garis terpecah, Anda dapat melakukan apa yang Anda inginkan dengan hasil perpecahan. Di sini, saya memutuskan untuk mencetak kolom kedua hanya dengan
print $2
. Perhatikan bahwa penting untuk menggunakan tanda kutip tunggal di sekitar instruksi awk jika tidak $ 2 akan diganti oleh shell.sumber
]
bukan braket sudut. Kurung sudut adalah<>
.[]
adalah "tanda kurung", atau hanya "tanda kurung".Anda dapat memodifikasi yang terakhir
cut
dalam saluran Anda untuk ini:Di atas berarti pemisah bidang adalah spasi, dan kami ingin memilih semua bidang mulai dari yang kedua. Urutan lengkap menjadi:
sumber
Untuk penguraian yang lebih kompleks, Anda harus menggunakan sed (1) :
Atau gunakan
-r
untuk menyederhanakan ekspresi reguler, seperti yang disarankan oleh pepoluan :sumber
Saya biasanya menggunakan Perl ketika semuanya menjadi terlalu sulit untuk sed dan grep.
Ada beberapa cara Anda bisa menulisnya di Perl. Misalnya, Anda mungkin lebih suka itu cepat, atau Anda mungkin lebih suka untuk menangani sedikit masalah yang tidak terduga dalam input (misalnya dua ruang di mana satu diharapkan).
Salah satu cara yang jelas (menganggap id adalah numerik, kota adalah alfabet, status adalah alfabet):
Atau lebih lambat tetapi lebih permisif (melakukan lebih banyak backtracking):
Atau lebih cepat (bidang berhenti saat kemunculan braket penutupan pertama):
Dari baris perintah daripada skrip, Anda bisa menggunakan
-n
opsi, yang pada dasarnya menambahkanwhile (<>) { BLOCK }
loop:atau jika Anda ingin penggunaannya menyerupai cut, Anda dapat menggunakan
-F
opsi, yang mirip dengan-F
opsi awk , misalnya:Cara ini jelas mengasumsikan bahwa tidak ada bidang yang akan mengandung pembatas.
sumber