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: Cyolfi Cyro
Subject: Re: [shell-script] Usando variáveis do script dentro do awk
Date: Thu, 13 Nov 2014 12:52:06 -0200

Grato pela ajuda de todos, no fim a solução do Tiago Peczenij foi perfeita para o script que estou trabalhando.



Cyro Ciolfi
Divisão de Suporte Computacional - CTI Renato Archer
Professor - Metrocamp

2014-11-13 10:17 GMT-02:00 Ronaldo Ferreira de Lima address@hidden [shell-script] <address@hidden>:
 

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]