Como posso recuperar e comparar dois valores de um arquivo? [fechadas]

0

Como posso recuperar e comparar dois valores das duas primeiras linhas de um arquivo? Eu tenho o seguinte texto:

05-24-2016, 2:59:32,0,0
05-24-2016, 2:59:37,0,0
05-24-2016, 2:59:42,0,0
05-24-2016, 2:59:47,0,0
05-24-2016, 2:59:52,0,0
05-24-2016, 2:59:57,0,0
05-24-2016, 3:00:02,0,0

e preciso comparar os valores da primeira linha em uma coluna específica (por exemplo, 2:59:52) e verifique a diferença em segundos.

Estou usando o seguinte comando, mas ainda não estou entendendo

awk '{ print $2 }' <filename>

Somente a diferença entre as duas primeiras linhas é necessária (e o restante das linhas deve ser ignorado).

    
por Taher 24.05.2016 / 12:17

3 respostas

2

Este script de shell fará a diferença em segundos entre os timestamps na coluna dois das duas primeiras linhas:

( IFS=, read -r _ a _; IFS=, read -r _ b _; a=$(date --date $a +%s); b=$(date --date $b +%s); echo "$a - $b" | bc | tr -d - ) <filename

Ele também pode ser dividido assim, se você preferir:

(
    IFS=, read -r junk a junk        # Get second comma separated field
    IFS=, read -r junk b junk
    a=$(date --date $a +%s)          # Convert to seconds since the epoch
    b=$(date --date $b +%s)
    echo "$a - $b" | bc | tr -d -    # Compute signed difference, then discard unary minus sign
) <filename
    
por 24.05.2016 / 14:17
0

Veja como conseguir os dois primeiros timestamps:

head -2 mydata.csv | awk -F, '{print$2}'

"Comparando" os tempos é um problema mais difícil. Se você quiser apenas saber qual deles é anterior, peça ao sort para verificar se estão na ordem de classificação:

if head -2 mydata.csv | awk -F, '{print$2}' | sort -c 2> /dev/null
then
    echo "The first timestamp is earlier than the second"
else
    echo "The first timestamp is later than the second"
fi

Se você realmente precisa calcular e exibir a diferença entre os timestamps, essa é uma questão diferente. Você pode adaptar esta resposta (para o awk) ou apenas para o google de sua linguagem de script favorita.

    
por 24.05.2016 / 14:02
0

Este script awk fornecerá a diferença, em segundos, entre os timestamps da coluna dois das duas primeiras linhas

awk -F, '{ cmd = "date --date " $2 " +%s "; cmd | getline sec[NR] } NR>2 { exit } END { print (sec[2] > sec[1]) ? (sec[2] - sec[1]) : (sec[1] - sec[2]) }' <filename

Ele também pode ser dividido assim, se você preferir:

awk -F, '
    # Read a line, get column two and convert it to seconds since the epoch
    { cmd = "date --date " $2 " +%s "; cmd | getline sec[NR] }

    # After two lines start to exit
    NR>2 { exit }

    # At exit print the absolute value of the difference between the two times
    END { print (sec[2] > sec[1]) ? (sec[2] - sec[1]) : (sec[1] - sec[2]) }

' <filename
    
por 24.05.2016 / 14:07