Все, у меня есть строка, из которой я хочу извлечь подстроку. Дело в том, что начальная позиция хранится в переменной. AWK, похоже, не распознает переменную.

Вот код

str="This is a test"  
s1="is"  
i=$(awk -v a="$str" -v b="$s1" 'BEGIN{print index(a,b)}')  
echo "$str" | awk '{print substr($0,$i)}'

Но это не работает. Как заставить awk узнать i ?

4 ответа4

1

С bash:

awk -v value="$i" '{print substr($0,value)}' <<< "$str"
1

Переменная не передается в awk . Вместо

echo "$str" | awk '{print substr($0,$i)}'

делать

echo $str | awk -v i="$i" '{print substr($0,i)}'

Тем не менее, выход

% ./a.sh
is is a test

Каков ваш предполагаемый результат?

0

Почему бы не выполнить всю обработку за один вызов awk?

haystack="This is a test"
needle="is"
printf '%s\n' "$haystack" | awk -v "needle=$needle" '{\
    i=index($0, needle)
    if (i) print substr($0, i)
}

Если вам нужен сценарий оболочки, чтобы также увидеть значение i , вы можете добавить > "/dev/tty" в конец приведенной выше команды print , затем добавить еще одну строку, в которой просто print i без перенаправления, а затем обернуть весь printf ... | awk ... строка в конструкции i=$(...) .

0

Прямой ответ на исходный вопрос: экранируя кавычки и позволяя оболочке расширять переменную:

awk '{print substr($0,'$i')}'

Если есть подозрение, что переменная может содержать пробел и другие вещи, и кто-то хочет, чтобы она воспринималась как строка в awk, можно просто использовать еще больше кавычек:

awk '{print index($0,"'"$s1"'")}'

... но каждый часто делает что-то менее оптимальное, если дело касается этого :-).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .