Com bash :
awk -v value="$i" '{print substr($0,value)}' <<< "$str"
Tudo, Eu tenho uma seqüência de caracteres do qual eu quero extrair uma substring. O problema é que a posição inicial é armazenada na variável. AWK Parece não reconhecer a variável.
Aqui está o código
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)}'
Mas isso não funciona. Como coagir o awk para reconhecer i
?
Com bash :
awk -v value="$i" '{print substr($0,value)}' <<< "$str"
A variável não está sendo passada para awk
. Em vez de
echo "$str" | awk '{print substr($0,$i)}'
faça
echo $str | awk -v i="$i" '{print substr($0,i)}'
No entanto, a saída é
% ./a.sh
is is a test
Qual é o resultado pretendido?
Por que não fazer todo o processamento em uma única invocação do 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)
}
Se você precisar que seu script de shell também veja o valor de i
, adicione > "/dev/tty"
ao final do comando print
acima e adicione outra linha dizendo apenas print i
sem redirecionamento. envolva toda a linha printf ... | awk ...
em uma construção i=$(...)
.
Responda diretamente à pergunta original: escapando as aspas e deixando o shell expandir a variável:
awk '{print substr($0,'$i')}'
Se houver suspeita de que a variável possa conter espaço em branco e outras coisas e a pessoa queira que seja tratada como uma string no awk, pode-se usar apenas mais aspas:
awk '{print index($0,"'"$s1"'")}'
... mas muitas vezes está fazendo algo menos que ótimo se se trata disso :-).
Tags awk