Czy w jakiś sposób można użyć funkcji bash w AWK?
Przykładowy plik (ciąg, int, int, int)
Mike 247808 247809 247810
Próba konwersji wartości z dziesiętnej na szesnastkową.
Funkcja zdefiniowana w .bashrc lub w skrypcie powłoki.
awk '{print $1 ; d2h($2)}' file
awk: wywołanie niezdefiniowanej funkcji d2h rekord wejściowy numer 1, numer pliku źródłowego pliku numer 1
d2h
były wykonywalne, ale nie, jeśli jest to „funkcja zdefiniowana w .bashrc lub w skrypcie powłoki”.source
), ale nie mogę zrozumieć, dlaczego to nie działa.bashrc
.$2
jest interpretowana jako kod powłoki.Możesz wywołać bash z awk i użyć jego danych wyjściowych. Jest to oczywiście niebezpieczne z punktu widzenia wydajności, jeśli zdarza się to zbyt często. Cytując stronę podręcznika:
polecenie byłoby skryptem bash, który zawiera definicję funkcji i wykonuje funkcję.
źródło
Spróbuj to zrobić:
AFAIK, nie możesz używać funkcji bash w awk, ale tylko skrypt. W razie potrzeby możesz użyć funkcji awk.
źródło
Używanie zdefiniowanej przez użytkownika funkcji bash w awk
Oświadczenie: Zdaję sobie sprawę, że OP nie chce tego zrobić, ale Google poprowadzi innych, takich jak ja, do tej odpowiedzi.
Sytuacja
Masz
bash
skrypt zorganizowany z funkcjami (ponieważ nie nienawidzisz siebie ani [większości] współpracowników) i co najmniej jedna z tych funkcji musi wywołać inną od wewnątrzawk
.Rozwiązanie
Scenariusz
Wydajność
źródło
awk
może uruchamiaćawk
funkcje. Aby uruchomićbash
funkcje, musiszawk
wykonaćbash
powłokę,bash
aby zinterpretować definicję tej funkcji i wywołać tę funkcję, z wartością wyodrębnioną przezawk
przekazane jako argumenty.Nie trywialne.
bash
obsługuje eksportowanie funkcji, więc jest dostępny w kolejnych wywołaniachbash
, więc jest to jeden ze sposobów przekazania definicji funkcji dobash
wywołanego przezawk
:Jedynymi sposobami
awk
wykonania polecenia (bash
tutaj) są jegosystem("cmd")
lubprint... | "cmd"
lub"cmd" | getline
. We wszystkich przypadkach,awk
uruchamia powłokę interpretowania żecmd
, ale to będziesh
, niebash
. Musisz więc zbudować wiersz poleceń,sh
ponieważ jest tobash
wywołanie, które interpretujebash
wiersz polecenia w celu wywołania funkcji, więc musisz być ostrożny z cytowaniem:To oznacza uruchomienie jednego
sh
i jednegobash
dla każdej linii, więc będzie dość nieefektywne. Byłoby to nawet znacznie bardziej nieefektywne niżbash
czytanie i dzielenie za pomocąwhile read loop
:źródło
To da ci duże szanse.
funkcja systemowa umożliwia parsowanie komendy bash w strumieniu awk.
źródło
Szybki hack demonstruje @HaukeLaging
command|getline
:1) niech wejście będzie:
Zgodnie ze składnią powłoki na wejściu
służy do oznaczania poleceń wbudowanych, które mają zostać zastąpione wynikiem jego wykonania.
2) Możemy rozszerzyć wbudowane polecenie powłoki o:
3) Zastosowanie (po zwykłym chmod):
źródło