Awk: Skripte auf dem Weg?

Sep 18 2020

Gibt es eine Möglichkeit, kleine awkScriptoids auf den Weg zu bringen?

Zum Beispiel habe ich diese wirklich nützliche Kollatierungsoperation:

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

Und ich kann es auf alle möglichen Arten nutzen:

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

Das einzige Problem ist, dass ich meine awk-Tools von nirgendwo aus aufrufen kann. Mit einem ausführbaren Shell-Skript kann ich es in einem bin-Ordner auf dem Pfad ablegen. Gibt es unter Linux einen Mechanismus, mit dem ich diese nicht ausführbaren awkQuelldateien von jedem Ort im Dateisystem aus verfügbar machen kann?

(mit der Qualifikation, dass der "Mechanismus" kein Kludge im "Warum schlägst du ihn nicht einfach mit einem Hammer" -Stil ist)

Antworten

5 Archemar Sep 18 2020 at 21:26

Zusätzlich zur Antwort von @ Roamia können Sie eine AWKPATHVariable für eine Liste der Verzeichnisse verwenden, nach denen gesucht werden sollcollate-csv.awk

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

bitte beachten Sie

  • .awk Verlängerung ist nicht obligatorisch, nur konsequent sein,
  • Die Shebang-Zeile ist zB #!/usr/bin/awk -fobligatorisch, wenn das Skript als eigenständiges Skript verwendet wird (kein awk -fAufruf).
  • Sie müssen verwenden awk -f(und awk wissen, wie man verwendet AWKPATH, Bash nicht)
3 roaima Sep 18 2020 at 20:46

Erstellen Sie ein ausführbares awkSkript und fügen Sie es Ihrem hinzu$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"

Jetzt können collate-csvSie wie jeden anderen Befehl verwenden

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