Используйте переменные в функции awk substr

0

Все, У меня есть строка, из которой я хочу извлечь подстроку. Дело в том, что начальная позиция хранится в переменной. 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 ?

smokinguns
источник

Ответы:

1

С удар :

awk -v value="$i" '{print substr($0,value)}' <<< "$str"
Prince John Wesley
источник
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

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

Jin
источник
Я хочу, чтобы вывод был "тест"
smokinguns
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=$(...) построить.

dubiousjim
источник
0

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

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

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

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

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

Daniel Andersson
источник