Я хотел бы добавить некоторые команды awk в сценарий bash. Сценарий bash принимает несколько входных данных, и входные данные передаются через $1, $2 and etc. Когда я вызываю awk, я также хочу использовать $1 для определения позиции в таблице, как мне это сделать?

example.sh

#! /user/bin/bash
arg=$1
outfile=$2
awk -F, -OFS, -v '{$2="$arg"; print}' > outfile

В этом скрипте $2 преобразуется в $outfile. Как я могу этого избежать?

1
Jeff Schaller 9 Окт 2019 в 21:05
Точно так же, как и вы, поскольку $1 и $2 в awk совершенно не связаны с $1 и $2 в оболочке (нет, $2 в сценарии awk НЕ разрешается в $outfile), но см. stackoverflow.com/q/19075671/1745001, как обрабатывать arg.
 – 
Ed Morton
9 Окт 2019 в 20:53

1 ответ

Лучший ответ

У вас несколько ошибок в команде awk.

Следующее будет импортировать $arg как переменную awk arg:

awk -F , -v OFS=, -v arg="$arg" '{ $2 = arg; print }' >"$outfile"

$2 невозможно интерпретировать как второй позиционный параметр здесь или в вашем коде, поскольку он встречается в одинарных кавычках, а оболочка не раскрывает переменные в одинарных кавычках.

OFS и arg (обе переменные awk) устанавливаются с помощью -v в командной строке. Вы не используете -v для установки OFS и неправильно используете -v перед фактическим кодом awk. Это дало бы вам ошибку (о которой вы не упоминаете). На самом деле -OFS, с GNU awk означает "включить оптимизацию и установить разделитель полей ввода на строку S,".

Обратите внимание, что если $arg (переменная оболочки) содержит обратную косую черту, которую вам нужно сохранить, то вместо этого лучше передать значение через среду, поскольку в противном случае они были бы интерпретированы awk:

arg="$arg" awk -F , -v OFS=, '{ $2 = ENVIRON["arg"]; print }' >"$outfile"

Предполагается, что выходной файл должен быть $outfile, а не outfile.

Связанный:

2
Kusalananda 9 Окт 2019 в 21:57