Como eu passo uma série de padrões no awk a partir de um shell script?

0

Eu tenho uma série de padrões armazenados em foo.txt e quero iterar sobre esses padrões e ver quais linhas de correspondência no arquivo bar.txt .

while read PWW
do
   cat user/dump/bar.txt | awk '/${PWW}/{print $2}' >> user/dump/out.txt
done < user/dump/foo.txt

foo.txt :

2100001b32
2100001b38
3100001b35
4100001b28
5100001b46
6100001b56

bar.txt :

2100001b32 good
2100001b38 bad
3100001b35 okay
4100001b28 large
5100001b46 good
6100001b56 bad

desejado out.txt :

good
bad
okay
large
good
bad

Não consigo pesquisar os valores em foo.txt . O loop while é executado e me dá saída vazia. Eu acho que awk está procurando ${PWW} (literalmente) em vez de seus valores de foo.txt .

Como posso fazer isso funcionar? Meu ambiente é Solaris 5.10, usando o shell Korn, com% básicoawk (old awk ).

    
por ayrton_senna 28.05.2015 / 19:04

3 respostas

1

Verifique suas cotações. Em shells unix, incluindo bash: aspas simples passam texto não modificado para o programa (assim como você disse passa ${PWW} , as aspas duplas permitem a expansão das variáveis.

No seu exemplo, você quer que ${PWW} seja expandido, mas não $2 . Você pode fazer isso assim:

awk "/${PWW}/"'{print $2}'
awk /${PWW}/{print '$2'}
awk "/${PWW}/{print \}"
    
por 28.05.2015 / 19:22
5

Aqui está uma solução pura:

$ awk 'FNR==NR{a[$1]=$2; next} {print a[$1]}' bar.txt foo.txt
good
bad
okay
large
good
bad

Como funciona

O script lê primeiro em bar.txt e salva suas informações no array a . Em seguida, ele lê foo.txt e imprime o valor correspondente.

  • FNR==NR{a[$1]=$2; next}

    FNR é o número de linhas lidas do arquivo atual e NR é o número de linhas lidas até o momento total. Assim, se FNR==NR , ainda estamos lendo o primeiro arquivo (bar.txt). Nesse caso, a[$1]=$2 é usado para adicionar uma entrada ao array a salvando esses valores. Em seguida, ignoramos o restante dos comandos no script e recomeçamos na linha next .

  • print a[$1]

    Se chegarmos aqui, estamos lendo o segundo arquivo, foo.txt. Nós lemos foo.txt linha por linha. Para cada linha, procuramos o valor correspondente à chave na primeira coluna e a imprimimos.

por 28.05.2015 / 19:15
1

O método canônico de passar valores de string do shell para awk é através da opção -v var=val .

Se você quiser usar essas sequências para uma correspondência de padrão, tradicionalmente com /.../ , será necessário escrever uma correspondência explícita na linha inteira:

awk -v pattern=${PWW} '$0 ~ pattern {print $2}'

BTW, para o Solaris 10, recomenda-se nawk sobre o antigo awk , se apenas para melhores mensagens de erro do que "bailing out at ..."

    
por 30.05.2015 / 10:24

Tags