echo -e 'one two three\nfour five six\nseven eight nine'
one two three
four five six
seven eight nine
bagaimana saya bisa melakukan beberapa "MAGIC" untuk mendapatkan hasil ini ?:
three
six
nine
UPDATE: Saya tidak membutuhkannya dengan cara khusus ini, saya membutuhkan solusi umum sehingga tidak peduli berapa banyak kolom berturut-turut, misalnya: awk selalu menampilkan kolom terakhir.
text-processing
awk
LanceBaynes
sumber
sumber
Jawaban:
Bahkan dapat dilakukan hanya dengan
'bash'
, tanpa'sed'
,'awk'
atau'perl'
:sumber
... | while read -r line; do echo ${line##* }; done
bash
indeks array adalah subjek evaluasi aritmatika, jadiecho ${line[nb - 1]}
sudah cukup. Seperti berbicara tentangbash
, Anda hanya dapat melewati “nb” hal:echo ${line[-1]}
. Sebuah alternatif yang lebih portabel dari kemudian:echo ${line[@]: -1]}
. (Lihat komentar Stephane Chazelas tentang indeks negatif di tempat lain.)Mencoba:
sumber
ps -ef | awk '{ print $NF }'
memiliki beberapa baris terpotong ...) Perl tidak memiliki batasan itu. ( gnu.org/software/autoconf/manual/autoconf-2.67/html_node/… : "Tradisional Awk memiliki batas 99 bidang dalam catatan. Karena beberapa implementasi Awk, seperti Tru64, membagi input bahkan jika Anda tidak merujuk ke bidang apa pun dalam skrip, untuk menghindari masalah ini, atur 'FS' ke karakter yang tidak biasa dan gunakan split. ")awk
implementasi apa yang memiliki batasan itu? Saya belum pernah melihatnya. Sayamawk
akan tersedak32768
tapi sayagawk
danigawk
bisa berurusan dengan jutaan bahagia. Bahkan kotak sibuk sayaawk
dapat menangani jutaan. Saya tidak pernah menemukanawk
yang tidak bisa menangani 100 bidang, itu adalah jumlah yang kecil. Apakah Anda yakin bahwa informasi itu masih relevan? Bahkan di Solaris?Lebih mudah dari yang Anda pikirkan.
sumber
Coba
grep
(lebih pendek / sederhana, tetapi 3x lebih lambat daripadaawk
karena penggunaan regex):Atau
ex
(bahkan lebih lambat, tetapi mencetak seluruh buffer setelah selesai, lebih berguna ketika perlu disortir atau diedit di tempat):Untuk mengganti di tempat, ganti
-sc'%p|q!'
dengan-scwq
.Atau
bash
:Performa
Mengingat file 1GB yang dihasilkan melalui:
Saya telah melakukan statistik waktu parsing (berlari ~ 3x dan mengambil yang terendah, diuji pada MBP OS X):
menggunakan
awk
:menggunakan
grep
:menggunakan
perl
:menggunakan
rev
+cut
:menggunakan
ex
:menggunakan
bash
:sumber
sumber
-a
:, bidang autosplit ke dalam@F
array;-l
mematikan$/
(pemisah rekaman input) dan menyimpannya ke$\
(pemisah rekaman keluaran). Karena tidak ada nomor oktal yang disediakan-l
, dokumen asli$/
diterapkan dalam bentuk cetak (ujung garis);-n
kode loop;-e
segera jalankan kode. Lihatman perlrun
.Ini juga dapat dilakukan dengan menggunakan
'sed'
:Memperbarui:
atau lebih sederhana:
sumber
Atau menggunakan
cut
:walaupun ini tidak memenuhi persyaratan 'solusi umum'. Menggunakan
rev
dua kali kita bisa menyelesaikan ini juga:sumber
rev
tidak berfungsi dengan karakter 'lebar', hanya yang byte tunggal, sejauh yang saya tahu.Menggunakan
awk
Anda dapat terlebih dahulu memeriksa apakah ada setidaknya satu kolom.sumber
awk 'NF{print $NF}'
.Dalam perl ini dapat dilakukan sebagai berikut:
keluaran:
Anda juga dapat mengulang melalui file, inilah contoh skrip yang saya tulis untuk mem-parsing file bernama budget.dat
contoh data dalam budget.dat:
(Anda dapat melihat saya perlu menangkap hanya kolom "terakhir", bukan kolom 2 saja)
Naskah:
sumber