Apakah mungkin menggunakan fungsi bash di dalam AWK?
Contoh file (string, int, int, int)
Mike 247808 247809 247810
Mencoba mengonversi nilai dari desimal ke heksadesimal.
Fungsi didefinisikan baik dalam .bashrc atau dalam skrip shell.
awk '{print $1 ; d2h($2)}' file
awk: memanggil fungsi yang tidak ditentukan input data d2h nomor 1, file sumber nomor baris 1
d2h
dapat dieksekusi, tetapi tidak jika itu merupakan "fungsi yang didefinisikan baik dalam .bashrc atau dalam skrip shell".source
) tetapi saya tidak bisa mencari tahu mengapa itu tidak berfungsi.bashrc
.$2
akhirnya ditafsirkan sebagai kode shell.Anda dapat memanggil bash dari awk dan menggunakan hasilnya. Itu jelas berbahaya dari perspektif kinerja jika terlalu sering terjadi. Mengutip halaman manual:
perintah akan menjadi skrip bash yang berisi definisi fungsi dan menjalankan fungsi.
sumber
Coba lakukan ini:
AFAIK, Anda tidak bisa menggunakan fungsi bash di awk tetapi hanya skrip. Anda dapat menggunakan fungsi awk jika perlu.
sumber
Menggunakan fungsi bash yang ditentukan pengguna di dalam awk
Penafian: Saya menyadari ini bukan apa yang OP coba lakukan, tetapi Google akan mengarahkan orang lain seperti saya ke jawaban ini.
Situasi
Anda memiliki
bash
skrip yang disusun dengan fungsi-fungsi (karena Anda tidak membenci diri sendiri atau [kebanyakan] rekan kerja) dan setidaknya 1 dari fungsi-fungsi tersebut perlu memanggil yang lain dari dalamawk
.Larutan
Naskah
Keluaran
sumber
awk
dapat menjalankanawk
fungsi. Agar dapat menjalankanbash
fungsi, Anda perluawk
mengeksekusibash
shell,bash
untuk menginterpretasikan definisi fungsi itu, dan memanggil fungsi itu, dengan nilai yang diekstraksi denganawk
diteruskan sebagai argumen.Tidak sepele.
bash
mendukung fungsi ekspor sehingga tersedia dalam pemanggilan berikutnyabash
, jadi itu salah satu cara untuk meneruskan definisi fungsi ke pemanggilanbash
olehawk
:Satu-satunya cara untuk
awk
menjalankan perintah (dibash
sini) adalah dengansystem("cmd")
, atauprint... | "cmd"
atau"cmd" | getline
. Dalam semua kasus,awk
jalankan shell untuk menafsirkannyacmd
, tetapi itu akan menjadish
, bukanbash
. Jadi, Anda perlu membuat baris perintah untuksh
itu adalahbash
doa yang menginterpretasikanbash
baris perintah untuk memanggil fungsi, jadi Anda harus berhati-hati dengan mengutip:Itu berarti menjalankan satu
sh
dan satubash
untuk setiap baris, sehingga akan menjadi sangat tidak efisien. Itu akan menjadi jauh lebih tidak efisien daripadabash
membaca dan membelah denganwhile read loop
:sumber
Ini akan memberi Anda peluang bagus.
fungsi sistem memungkinkan Anda untuk mem-parsing perintah bash dalam aliran awk.
sumber
Hanya peretasan singkat yang menunjukkan @HaukeLaging
command|getline
:1) biarkan input menjadi:
Mengikuti sintaksis shell, pada input,
digunakan untuk menunjukkan perintah inline yang akan diganti oleh hasil eksekusi.
2) Kami dapat memperluas perintah shell inline dengan:
3) Penggunaan (setelah chmod biasa):
sumber