Awk: Скрипты на пути?

Sep 18 2020

Есть ли способ поместить awkна путь маленькие скриптоиды?

Например, у меня есть очень полезная операция сортировки:

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

И я могу использовать это разными способами:

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

Единственная проблема в том, что у меня нет возможности вызывать свои инструменты awk откуда угодно. С помощью исполняемого сценария оболочки я могу поместить его в папку bin по пути. Есть ли в Linux механизм, с помощью которого я могу сделать эти неисполняемые awkисходные файлы доступными из любого места в файловой системе?

(с оговоркой, что «механизм» - это не «почему бы тебе просто не ударить его молотком» в стиле клуджа)

Ответы

5 Archemar Sep 18 2020 at 21:26

В дополнение к ответу @ Roamia вы можете использовать AWKPATHпеременную для списка каталогов, где искатьcollate-csv.awk

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

пожалуйста, обратите внимание

  • .awk расширение не обязательно, просто будьте последовательны,
  • например, строка shebang #!/usr/bin/awk -fявляется обязательной, когда скрипт используется отдельно как скрипт (без awk -fвызова),
  • вам придется использовать awk -f(и awk знает, как использовать AWKPATH, bash - нет)
3 roaima Sep 18 2020 at 20:46

Создайте исполняемый awkскрипт и добавьте его в свой$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"

Теперь вы можете использовать так collate-csvже, как и любую другую команду

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