shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Usando variáveis do script dentro do awk


From: Ronaldo Ferreira de Lima
Subject: Re: [shell-script] Usando variáveis do script dentro do awk
Date: Thu, 13 Nov 2014 10:17:00 -0200
User-agent: mutt-ng/devel-r804 (Linux)

Saudações Cyolfi Cyro,

On Thu, Nov 13, 2014 at 08:49:01AM -0200, Cyolfi Cyro address@hidden 
[shell-script] wrote:
> Olá pessoal,
> Meu problema é o seguinte, imagine a seguinte variável:
> RAMAL=6166
> Eu quero listar todas as linhas aonde o ramal 6166 for encontrado na terceira
> coluna com delimitador ";".
> Cheguei a conclusão que a melhor solução seria o awk, e fiz o seguinte teste:
> awk -F";" '{ if ($3 ~ /6166/) print }' ARQUIVO
> Funcionou perfeito!!!
> O problema é que o ramal irá variar dentro de um loop e por isso no lugar do
> 6166 eu gostaria de colocar uma variável.
> Já tentei:
> awk -v NUM="${RAMAL}" -F";" '{ if ($3 ~ /NUM/) print }' ARQUIVO
> e outra tentativas que não me devolvem resultado algum.
> Isso me leva a questão, o awk é a melhor forma de se procurar valor em colunas
> ou existe forma melhor?
> O que estou errando no comando?
Tudo  o que  você  colocar  entre '//'  será  interpretado como  "regexp
constant". No  seu caso,  a sua  variável não foi  interpretada e  o awk
procurou pela string "NUM" dentro do arquivo. Faça teste inserindo "NUM"
em um  arquivo de testes. Isto  é simples de resolver,  basta remover as
'//'.  De qualquer  forma, você  não parece  precisar usar  regexp neste
caso, poderia ter utilizado apenas '$3 == NUM'.

Você mencionou ainda que existe uma lista de ramais que serão procurado
dentro do arquivo que viriam de um loop. Se quiser evitar o loop, você
pode tentar construir tudo dentro de um único script awk, que sem
dúvidas seria mais performático, exemplo:

    #!/usr/bin/gawk

    BEGIN {
        FS = ";";
        # Dependendo de como obtém a lista, a construção a seguir
        # pode ser feita dinamicamente
        ramal[6166] = 1;
        ramal[6167] = 1;
        ramal[6168] = 1;
    }

    $3 in ramal

Você pode transformar esse awk-script em awk-inline também.

Em puro shell-script também seria bem simples:

    #!/bin/bash

    ramal[6166]=1
    ramal[6167]=1
    ramal[6168]=1

    while IFS=$'\n' read record; do
        IFS=';' read -a field <<< "$record"
        test "${ramal[${field[2]}]}"0 -eq 10 && echo $record
    done < arquivo

> Grato por qualquer dica!!!
> Cyro Ciolfi
> Divisão de Suporte Computacional - CTI Renato Archer
> Professor - Metrocamp

[]'s

--
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------
http://tecnoveneno.blogspot.com


reply via email to

[Prev in Thread] Current Thread [Next in Thread]