Não foi possível imprimir o dado errado no script bash

0

Estou despejando dados em um arquivo csv (my_datum_file.csv). Os conteúdos são separados por vírgulas, e eu quero encontrar a última instância do quarto parâmetro (ie a última instância do datum referente a MX3, TMX, MSV, etc., onde impressa). O quinto parâmetro é uma 'subclasse' do quarto parâmetro (isto é, o TMX tem 098 e 001). Também é importante que o 7º parâmetro seja "status" em oposição a "SVlts". P: eu quero que o décimo valor (que é um período de tempo em minutos) seja convertido em horas. Eu gostaria de imprimir esse valor.

Então, no terminal, escrevi:

$ cat /home/ed/start_up_job/my_datum_file.csv | awk -F, '( $4 == "TMX" ) && ( $5 == "098" ) && ( $7 == "status" ) {print $10/60}' | tail -1''

O resultado final é 1022,25 horas, o que é ótimo;

Eu incluí isso em um pequeno script bash genérico

#!/bin/bash

machine_ID="$1"
machine_number="$2"

echo "$1 $2 hours is 'awk -F, -v MID="$machine_id" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/my_datum_file.csv'"

então, quando eu chamar meu script bash do terminal $ ./myscript.txt TMX 098 , recebo a seguinte saída TMX 098 hours is: 0 Minha saída esperada seria TMX 098 hours is: 1022.25

Eu não sei o que está errado?

    
por 3kstc 05.03.2015 / 00:06

1 resposta

2

Substituindo cat que foi usado do terminal e com awk -F, -v MID="$machine_ID" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/my_datum_file.csv trabalhado.

Entendendo o código:

  • awk -F define o separador de campo como ,
  • -v atribui um valor a uma variável de programa
  • MID="$machine_ID" em que as MID é o nome da variável recém-fornecida em awk para $machine_ID , que é uma variável de shell
  • -v MNR="$machine_number" da mesma forma -v reatribui uma variável awk chamada como MNR para uma variável shell chamada $machine_number
  • ( $4 == MID ) iguala o parâmetro 4 th com o que MID detém
  • && e
  • ( $5 == MNR ) iguala o parâmetro 5 th com o que MNR detém
  • && e
  • ( $7 == "status" ) iguala o parâmetro 7 th com status
  • {t=$10} atribui o valor 10 th a t
  • END é a regra que foi executada uma vez, depois que toda a entrada foi lida
  • print int(t/60) imprime a saída de t/60 (note que não há sinal de $ na frente de t ) como int eger
  • /home/ed/start_up_job/my_datum_file.csv do arquivo em ~

Essencialmente, no arquivo /home/ed/start_up_job/my_datum_file.csv , esse código encontra os valores que contêm MID e MNR . Em seguida, o código coloca o valor do parâmetro [$] 10 th como t e print s como int eger após / ing 60

    
por 05.03.2015 / 05:10