awk se o loop não conseguir imprimir

1

Eu tenho uma variável Test como abaixo

Test="Environment Dev"

Eu quero comparar col2 char 1 com outros e imprimir todo o nome de env

isto é o que eu fiz

echo $Test|awk '{
if ($2 == "^D*")
print "DEV";
else
print "$2"
}'

Estou obtendo $2 como saída, mas se for Test, comparando D com T , quero saída como TEST

Eu também tentei isso, mas a saída não está mudando quando col2 muda.

echo $Test|awk '{
if ($2 ~ "^D*")
print "DEVELOPMENT"
else
print "$2"
}'
DEVELOPMENT

Por favor, ajude onde estou cometendo erros

    
por Maddy 29.03.2016 / 17:53

2 respostas

2

Alguns erros que vejo no seu script awk:

  • Use ~ /whatever/ para expressões regulares.
  • Não adicione um asterisco na ^D regexp, que também corresponderá a zero D caracteres.
  • Remova as aspas em torno do $2 para evitar imprimi-lo literalmente.

Uma possível solução:

echo $Test | awk '{
if ($2 ~ /^D/)
  print "DEV";
else
  print $2
}'
    
por 29.03.2016 / 18:06
0

Se você estiver usando bash ou ksh ou zsh , nem precisa usar awk , você pode usar ${parameter#word} para remover um prefixo ... nesse caso, o prefixo de "todos os personagens até o primeiro espaço":

$ Test="Environment Dev"
$ SecondWord=${Test#* }
$ echo $SecondWord
Dev

$ [[ $SecondWord =~ ^D ]] && echo DEV || echo $SecondWord
DEV

$ SecondWord=Foo
$ [[ $SecondWord =~ ^D ]] && echo DEV || echo $SecondWord 
Foo

Isso pode funcionar em outros tipos de Bourne, mas eu testei apenas nos três que eu mencionei acima.

BTW, se você quiser uma correspondência "gulosa" (ou seja, a string correspondente mais longa em vez da mais curta - para obter a palavra ÚLTIMA em vez da segunda e subsequentes palavras, se houver), use ## # .

    
por 30.03.2016 / 02:27

Tags