Como ao ler linha com um cano

1

No momento, estou tentando ler um arquivo csv com o BASH. O valor de 10% [ $f10 ] do arquivo csv deve ser maior que 0 para uma determinada classe de máquina e ID de máquina [ m_class ] e [ m_id ] (esses são definidos pelo usuário). Eu estou tac ing o arquivo como a informação mais recente é escrita por último. Aqui está o trecho de código [ignorar os ecos, como eu os coloquei lá também ver se meu código estava entrando no while e se loops]:

IFS=","
while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15
do

            echo "this is while loop"

            if [ "$f7" == "EnHr" ] && [ "$f10" -gt 0 ] && [ "$f4" == "$m_class" ] && [ "$f5" == "$m_id" ]
            then
                    hex_sensor_data=$f10
                    echo "IN IF LOOP: $hex_sensor_data"
                    break
            fi  
            echo "HEX DATA $hex_sensor_data"
done <<<"tac /DIRECTORY/TO/FILE.csv | sed 's/o,632/o,101/g' | sed 's/o,938/o,103/g' |  sed 's/o,510/o,112/g' | sed 's/ombo,713/ombo,102/g'"

Esse loop while renderiza um valor 0 para qualquer m_class m_id, também o $f10 está em valor hexadecimal - Depois de break ing do loop while read Eu quero fazer algum processamento com hex_sensor_data value.

P: Eu quero obter o último valor que é maior que 0 no espaço 10 do arquivo csv enquanto o sétimo valor do csv contém EnHr, como assim como o 4º e 5º hold para um determinado m_class e m_id , respectivamente. Para fazer isso eu preciso ler o arquivo csv de baixo (informações mais recentes) para o topo (informações mais antigas) Eu estou fazendo isso com tac , bem como fazer algumas tubulações. Qualquer ajuda é apreciada!

    
por 3kstc 20.07.2015 / 04:39

3 respostas

1

<<< no bash é uma string aqui . Você passou a própria string de script tac /DIRECTORY/TO/FILE.csv ... para stdin while .

Você pode querer usar a substituição de processos :

while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15
do
    ...
done < <(tac /DIRECTORY/TO/FILE.csv ...)
    
por 20.07.2015 / 05:38
1

você pode tentar

tac /DIRECTORY/TO/FILE.csv |
sed -e 's/o,632/o,101/g' -e  's/o,938/o,103/g'  -e 's/o,510/o,112/g' -e 's/ombo,713/ombo,102/g' |
while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15
do

            if [ "$f7" = "EnHr" ] && [ "$f10" -gt 0 ] && [ "$f4" = "$m_class" ] && [ "$f5" = "$m_id" ]
            then
                    hex_sensor_data=$f10
                    echo "IN IF LOOP: $hex_sensor_data"
                    break
            fi
done
  • não há necessidade de retroceder a nova linha se o último caractere for um canal ( | )
  • um único sed pode executar toda a substituição
por 20.07.2015 / 08:45
0
#!/bin/bash

m_class='aaa'
m_id='bbb'

f4=0
f5=1
f7=2
f10=3

csvdata=( $(tac CSVFILE) )

hex_sensor_data=0
for linex in ${csvdata[@]}
do
    csvline=(
        $(echo "${linex}"|awk -F, '{if ($10 -gt 0) print $4,$5,$7,$10}')
    )
    [[ ${csvline[f4]} != "${m_class}" ]] && continue
    [[ ${csvline[f5]} != "${m_id}" ]] && continue
    [[ ${csvline[f7]} != "EnHr" ]] && continue
    hex_sensor_data=${csvline[f10]}
    break
done
[[ "${hex_sensor_data}" != "0" ]] && echo "${hex_sensor_data}"
    
por 10.01.2018 / 19:30