Awk: script sul percorso?

Sep 18 2020

C'è un modo per mettere piccoli awkscriptoidi sul sentiero?

Ad esempio, ho questa operazione di confronto davvero utile:

// collate-csv.awk
FNR > 1 || NR == 1

E posso usarlo in tutti i tipi di ottimi modi:

xargs -a $(find * -name *.csv) awk -F',' -f collate-csv.awk | ...

L'unico problema è che non ho un modo per chiamare i miei strumenti awk da nessuna parte. Con uno script di shell eseguibile, posso rilasciarlo in una cartella bin nel percorso. Esiste un meccanismo in Linux in cui posso rendere disponibili questi file awksorgente non eseguibili da qualsiasi punto del filesystem?

(con la qualifica che il "meccanismo" non è un "perché non lo colpisci con un martello" in stile kludge)

Risposte

5 Archemar Sep 18 2020 at 21:26

Oltre alla risposta di @ Roamia puoi usare la AWKPATHvariabile per un elenco di directory in cui cercarecollate-csv.awk

AWKPATH=${HOME}/include/awk:/some/other/path export AWKPATH xargs -a $(find * -name *.csv) awk -f collate-csv.awk -F',' | ...

notare che

  • .awk l'estensione non è obbligatoria, basta essere coerenti,
  • la riga shebang, ad esempio, #!/usr/bin/awk -fè obbligatoria quando lo script è usato come script autonomo (nessuna awk -fchiamata),
  • dovrai usare awk -f(e awk sa come usare AWKPATH, bash no)
3 roaima Sep 18 2020 at 20:46

Crea uno awkscript eseguibile e aggiungilo al tuo file$PATH

mkdir -p "$HOME/bin"
cat >"$HOME/bin/collate-csv <<'x' #!/usr/bin/awk -f # # collate-csv.awk # NR == 1 { print } FNR == 1 { next } {print} x chmod a+x "$HOME/bin/collate-csv"
export PATH="$PATH:$HOME/bin"

Ora puoi usare collate-csvproprio come faresti con qualsiasi altro comando

xargs -a $(find * -name *.csv) collate-csv -F',' | ...