2012-07-24 13 views
6

Mam skryptu awk który jest nazywany przez:Deklarowanie funkcji awk w bash

awk -f myawkfile.awk arguments 

skrypt awk nazywa się mój skrypt bash przy użyciu tego samego wspomniane połączenie.

Czy mogę zamiast wywoływania skryptu awk zadeklarować go jako funkcję w skrypcie bash . Pomyślałem, że byłoby to łatwe, pisząc przedrostek awk z przodu i z tyłu zaznaczając cały kod, a następnie przypisując nazwę funkcji, aby wywołać ją w dowolnym momencie. Jakoś to nie działa.

Próbuję to zrobić, ponieważ nie chcę, aby mój skrypt był zależny od innego skryptu. I nie jestem tym, który napisał skrypt awk. Bierze plik jako dane wejściowe, wykonuje pewne rzeczy i zwraca zmodyfikowany plik, który jest używany w moim skrypcie.

+0

*** Dlaczego *** nie chcesz, aby twój skrypt był zależny od innego skryptu? Wolałbym trzymać się jednego języka na plik skryptu. Sprawia, że ​​testowanie, czytanie i konserwacja są o wiele łatwiejsze! – Johnsyweb

+0

Tak! masz rację, ale uruchomienie skryptu w folderze tymczasowym powoduje, że zależność jest liabililty. – Gil

+0

Dlaczego nie zainstalować skryptu awk gdzieś w '$ {PATH}'? – Johnsyweb

Odpowiedz

9

Korzystanie heredoc notation można napisać coś takiego

#!/bin/bash 

awk_program=$(cat << 'EOF' 
    /* your awk script goes here */ 
EOF 
) 

# ... 

# run awk script 
awk "$awk_program" arguments 

# ... 
+0

Świetnie! Nigdy nie znałem tej sztuczki :(Dziękuję koledze! Uratowałeś mi dużo czasu! – Gil

+1

Po co używać heredoc? Po prostu wykonaj: 'awk_program = 'wstaw tutaj skrypt'' –

+0

@WilliamPursell, ponieważ skrypt, o który pytano i który był usunięty z pytania zawiera więcej niż 20 wierszy, dzięki czemu będzie on nieczytelny i nie do zapamiętania (może nie być to konieczne, ale lepiej zachować taką możliwość) – xaizek

2

Wystarczy napisać skrypt awk w funkcję:

#!/bin/sh -e 

foo() { awk '{print $2}' "[email protected]"; } 
foo a b       # Print the 2nd column from files a and b 
printf 'a b c\nd e f\n' | foo # print 'b\ne\n' 

Należy zauważyć, że średnia awk wydaje się dwuznaczne na zachowanie jeżeli pusty ciąg jest przekazywana jako argument, ale powłoka gwarantuje, że "[email protected]" rozwija się do pól zerowych, a nie do pustego łańcucha, więc jest to problem tylko wtedy, gdy wywołujemy foo z pustym argumentem.

+0

Nie mogę zadeklarować mojego skryptu awk zgodnie z sugestią użytkownika! – Gil

+0

@Geekasaur Dlaczego nie? Jaki błąd dostałeś? –