shell script para mapear campos e retornar o valor correspondente da lista

-1
Symbol  Test  
XXX,1  
GHL,2  
MKT,13  
LOC,15  
LMT,76  
TIF,45  

O script de shell deve retornar o símbolo correspondente para cada teste.

Se $Test=1 , então $symbol deve ser XXX

como posso conseguir isso?

    
por canonical 07.09.2015 / 23:37

3 respostas

3

Você pode usar a matriz associativa bash :

declare -A foobar
while read -r foo bar; do foobar["$bar"]="$foo"; done < <(tail -n +2 file.txt)

Isso gerará uma matriz associativa chamada foobar lendo as linhas começando pela segunda linha do arquivo que contém o mapeamento de valor-chave.

Agora você pode declarar uma pequena função como:

choose () { echo "${foobar["$1"]}" ;}

Ele mostrará o valor armazenado na chave especificada dada como primeiro argumento.

Exemplo:

$ choose 2
GHL
$ choose 1
XXX
    
por heemayl 07.09.2015 / 23:54
1

Isso só precisa de um pouco de awk :

awk -v var=1 '$2 == var {print $1}' your_file

Ou seja, procure as linhas com o segundo campo igual à variável dada var ; quando isso acontecer, imprima o primeiro campo.

    
por fedorqui 07.09.2015 / 23:41
0

O Python também pode fazer o trabalho:

python -c 'import sys;print [i.split(",")[0] for x,i in enumerate(sys.stdin) if x > 0 and i.strip().split(",")[1] == sys.argv[1]]' 13  < input.txt

Ou como script real:

#!/usr/bin/env python
import sys
for x,i in enumerate(sys.stdin): 
    if x > 0 and i.strip().split(",")[1] == sys.argv[1]:
         print i.strip().split(",")[0]

Execução de teste:

$ python find_line.py 76 < input.txt                                                                                         
LMT

A maneira como isso funciona é simples: nós redirecionamos input.txt para stdin do script e então o lemos linha por linha, pulando a primeira linha e dividindo as linhas na lista usando vírgula. O número desejado para procurar é dado como primeiro argumento de linha de comando.

Seria muito mais fácil se não houvesse a linha de cabeçalho - isso eliminaria enumerate() call e simplificaria a verificação de linha para if i.strip().split(",")[1] == sys.argv[1]

    
por Sergiy Kolodyazhnyy 31.12.2016 / 00:53