Use variáveis na função awk substr

0

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 ?

    
por smokinguns 13.10.2011 / 08:24

4 respostas

1

Com bash :

awk -v value="$i" '{print substr($0,value)}' <<< "$str"
    
por 13.10.2011 / 08:45
1

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 13.10.2011 / 08:48
0

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=$(...) .

    
por 19.04.2012 / 13:32
0

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 :-).

    
por 19.04.2012 / 14:17

Tags