Script de shell para atribuir valores de uma tabela de pesquisa é muito lento

3

Estou tentando atribuir algumas variáveis de um arquivo de pesquisa com um script de shell.
Eu tenho algo funcionando, mas parece desnecessário lento.

Script:

while read line           
    do           
        code='echo $line | awk -F' ' '{print $1}'';
        device='echo $line | awk -F' ' '{print $2}'';
        state='echo $line | awk -F' ' '{print $3}'';
        if  [[ $code == $message ]]
            then
                echo "Translated: $device-$state";
        fi
done <CODE-LIST.txt

CODE-LIST.txt:

MQTT-CODE   DEVICE  STATE
1-1-32-16236607 RGB_LED ON
1-1-32-16203967 RGB_LED OFF

Existe uma maneira mais rápida de fazer isso? (Talvez awk ou sed)
Obrigado pela ajuda!

    
por David 24.10.2014 / 11:31

2 respostas

6

Que tal:

while read code device state junk; do
    if [[ $code == $message ]]; then
        echo "Translated: $device-$state"
    fi
done <CODE-LIST.txt

Usar processos extras (ou seja, bifurcar o awk toda vez) diminuirá muito a velocidade. read lerá vários campos, separados por $IFS (o valor padrão é todo o espaço em branco). A última variável listada receberá o restante da linha, se houver.

Estou apenas me perguntando de onde $message deve vir. Fora do snippet de código, talvez?

EDITAR: Se a parte do código ocorrer apenas uma vez na entrada, você poderá break sair do loop assim que for encontrado; que também acelerará as coisas.

    
por 24.10.2014 / 11:35
5

Poderia usar o awk para a coisa toda.
O awk também é muito mais rápido que while read loops.

awk -vM="$Message" '$1==M{print "Translated:",$2"-"$3}' CODE-LIST.txt

Explicação

    -vM="$Message" - Create a variable named M with the value from $Message

     $1==M         - If the first field is equal to variable M($Message)

     {print "Translated:",$2"-"$3} - Write Translated and the second and third fields

     CODE-LIST.txt - The file being read

Mais notas no código

Um , é usado em conjunto com a impressão para imprimir o OFS (separador de campo de saída) que, por padrão, é um espaço |

A menos que seja especificado de forma diferente, o código será executado em cada linha do arquivo por padrão.


O comando print adicionará o ORS (separador de registro de saída) ao final da string impressa. Por padrão, isso é uma nova linha.

    
por 24.10.2014 / 14:38