Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

1. Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Gabi
GabiS

(usa Ubuntu)

Enviado em 16/05/2017 - 13:30h

Boa tarde pessoal!
Estou tentando fazer o seguinte:

Tenho um arquivo como o arquivo abaixo:

10:51:37,43
10:51:39,37
10:51:40,03
10:51:40,67
10:51:41,29
10:51:41,97
10:51:42,60
10:51:43,24
10:51:43,89
10:51:44,52
10:51:45,16
10:51:45,80
10:51:46,43
10:51:47,07
10:51:47,71
.
.
.

Preciso subtrair o valor de cada linha pelo valor da primeira linha (como no exemplo abaixo) e armazenar o resultado em um outro aquivo:

10:51:37,43 - 10:51:37,43
10:51:39,37 - 10:51:37,43
10:51:40,03 - 10:51:37,43
.
.
.
Cada coluna se refere á hora:minuto:segundo:milisegundo respectivamente

Eu fiz assim, mas não está funcionando, sou iniciante em shell script, alguém pode me ajudar?

#!/bin/bash
TIMESTAMP="1-sp-C-timestamp.dat";

cat $TIMESTAMP | sed -n '1p' >>primeiro.txt ;

h=`cat primeiro.txt | awk -F : '{print $1}'`;
m=`cat primeiro.txt | awk -F : '{print $2}'`;
s=`cat primeiro.txt | awk -F : '{print substr($3,1,2)}'`;
ms=`cat primeiro.txt | awk -F : '{print substr($3,4,5)}'`;

cat $TIMESTAMP | while read line
do
echo "$line" |

H=`awk -F : '{print $3}'` &&
M=`awk -F : '{print $2}'` &&
S=`awk -F : '{print substr($3,1,2)}'`&&
MS=`awk -F : '{print substr($3,4,5)}'`|

TMs=$($MS-$ms) |

if [ $S -lt $s ]; then
TS=$(($S+60)-$s) &&
M=$($M-1);
else
TS=$($S-$s);
fi |

if [ $M -lt $m ]; then
TM=$(($M+60)-$m) &&
H=$($H-1);
else
TM=$($M-$m);
fi |

TH=$($H-$h) ;

$TH":"$TM":"$TS","$TMs;
done >> teste.txt


A lógica acredito que está correta....meu problema é com a sintaxe


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/05/2017 - 22:47h

GabiS escreveu:

Obrigada por avisar do relógio rs

Obrigada, funcionoou aqui direitinho

Eu estava tentando fazer uma outra coisa, assim:
#!/bin/bash
>RESULT.txt
sed 's/,/:/' "1-sp-C-timestamp.dat" > tempo.temp
CP1=$(awk -F":" 'NR==1 {OFS=":"; print $1,$2,$3}' tempo.temp)
CP2=$(awk -F":" 'NR==1 {print $4}' tempo.temp)
DT01=$(bc <<< $(date -d "${CP1}.${CP2}" +%s.%3N))
while read -r line;do
DT02=$(date -d "${line:0:8}.${line:9:10}" +%s.%3N)

total=$(bc <<< "${DT02}-${DT01}")
ms=$(($total%1000))
s_aux=$((total/1000))
s=$(($s_aux%60))
m_aux=$(($s_aux/60))
m=$(($m_aux%60))
h=$(($m_aux}/60))

echo "$h":"$m":"$s":"$ms" >> RESULT.txt
done <tempo.temp


mas eu estava tentando entender o bc para utilizar no calculo que estava fazendo....nooossa estou muito atrasada né...vejo que tenho muito que aprender rs :/

Mais uma vez obrigada

De nada!!! De nada!!! De nada!!! rsrsrsrsrs
Gabis, postei na correria e tem um errinho . . . rsrsrsrs
Não sei se notou, mas, eleiminei a criação do .temp com todos IFS=":"
Altere .temp para .txt
Segue com a alteração citada e uma simplificada:
#!/bin/bash
>RESULT.txt
CP1=$(awk -F"[:,]" 'NR==1 {print $1":"$2":"$3"."$4}' tempo.txt)
DT01=$(date -d "${CP1}" +%s.%3N)
while read -r line;do
DT02=$(date -d "${line/,/.}" +%s.%3N)
echo "$CP1 - ${line/,/.} = $(date -d "@$(bc <<< "10800+(${DT02}-${DT01})")" +%T:%2N)" >> RESULT.txt
done<tempo.txt

Não esqueça de marcar como resolvido . . . E a MELHOR RESPOSTA...

mso








3. Re: Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/05/2017 - 18:34h

GabiS escreveu:

Boa tarde pessoal!
Estou tentando fazer o seguinte:

Tenho um arquivo como o arquivo abaixo:

10:51:37,43
10:51:39,37
10:51:40,03
10:51:40,67
10:51:41,29
10:51:41,97
10:51:42,60
10:51:43,24
10:51:43,89
10:51:44,52
10:51:45,16
10:51:45,80
10:51:46,43
10:51:47,07
10:51:47,71
.
.
.

Preciso subtrair o valor de cada linha pelo valor da primeira linha (como no exemplo abaixo) e armazenar o resultado em um outro aquivo:

10:51:37,43 - 10:51:37,43
10:51:39,37 - 10:51:37,43
10:51:40,03 - 10:51:37,43
.
.
.
Cada coluna se refere á hora:minuto:segundo:milisegundo respectivamente

Eu fiz assim, mas não está funcionando, sou iniciante em shell script, alguém pode me ajudar?

#!/bin/bash
TIMESTAMP="1-sp-C-timestamp.dat";

cat $TIMESTAMP | sed -n '1p' >>primeiro.txt ;

h=`cat primeiro.txt | awk -F : '{print $1}'`;
m=`cat primeiro.txt | awk -F : '{print $2}'`;
s=`cat primeiro.txt | awk -F : '{print substr($3,1,2)}'`;
ms=`cat primeiro.txt | awk -F : '{print substr($3,4,5)}'`;

cat $TIMESTAMP | while read line
do
echo "$line" |

H=`awk -F : '{print $3}'` &&
M=`awk -F : '{print $2}'` &&
S=`awk -F : '{print substr($3,1,2)}'`&&
MS=`awk -F : '{print substr($3,4,5)}'`|

TMs=$($MS-$ms) |

if [ $S -lt $s ]; then
TS=$(($S+60)-$s) &&
M=$($M-1);
else
TS=$($S-$s);
fi |

if [ $M -lt $m ]; then
TM=$(($M+60)-$m) &&
H=$($H-1);
else
TM=$($M-$m);
fi |

TH=$($H-$h) ;

$TH":"$TM":"$TS","$TMs;
done >> teste.txt
A lógica acredito que está correta....meu problema é com a sintaxe


Boa noite Gabriela.
Segue a solução:
#!/bin/bash
>RESULT.txt
sed 's/,/:/' tempo.txt > tempo.temp
CP1=$(awk -F":" 'NR==1 {OFS=":"; print $1,$2,$3}' tempo.temp)
CP2=$(awk -F":" 'NR==1 {print $4}' tempo.temp)
DT01=$(bc <<< $(date -d "$CP1.${CP2}" +%s.%3N))
while read -r line;do
DT02=$(date -d "${line:0:8}.${line:9:10}" +%s.%3N)
echo "$DT02 - $DT01 = $(bc <<< "${DT02}-${DT01}")" >> RESULT.txt
done<tempo.temp


OBS.: Se a resposta foi esclarecedora, marque o tópico como resolvido . . .
E para me incentivar a continuar colaborando . . . A minha resposta como A MELHOR . . . :)
NÃO APAGUE o TóPICO, pode ser útil para OUTROS . . .


Interessante:
echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -n '/^[ ]\+Se/,/dou/p')\n" 

Att.:
MarceloOliver




4. Re: Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Gabi
GabiS

(usa Ubuntu)

Enviado em 16/05/2017 - 18:51h

msoliver escreveu:

GabiS escreveu:

Boa tarde pessoal!
Estou tentando fazer o seguinte:

Tenho um arquivo como o arquivo abaixo:

10:51:37,43
10:51:39,37
10:51:40,03
10:51:40,67
10:51:41,29
10:51:41,97
10:51:42,60
10:51:43,24
10:51:43,89
10:51:44,52
10:51:45,16
10:51:45,80
10:51:46,43
10:51:47,07
10:51:47,71
.
.
.

Preciso subtrair o valor de cada linha pelo valor da primeira linha (como no exemplo abaixo) e armazenar o resultado em um outro aquivo:

10:51:37,43 - 10:51:37,43
10:51:39,37 - 10:51:37,43
10:51:40,03 - 10:51:37,43
.
.
.
Cada coluna se refere á hora:minuto:segundo:milisegundo respectivamente

Eu fiz assim, mas não está funcionando, sou iniciante em shell script, alguém pode me ajudar?

#!/bin/bash
TIMESTAMP="1-sp-C-timestamp.dat";

cat $TIMESTAMP | sed -n '1p' >>primeiro.txt ;

h=`cat primeiro.txt | awk -F : '{print $1}'`;
m=`cat primeiro.txt | awk -F : '{print $2}'`;
s=`cat primeiro.txt | awk -F : '{print substr($3,1,2)}'`;
ms=`cat primeiro.txt | awk -F : '{print substr($3,4,5)}'`;

cat $TIMESTAMP | while read line
do
echo "$line" |

H=`awk -F : '{print $3}'` &&
M=`awk -F : '{print $2}'` &&
S=`awk -F : '{print substr($3,1,2)}'`&&
MS=`awk -F : '{print substr($3,4,5)}'`|

TMs=$($MS-$ms) |

if [ $S -lt $s ]; then
TS=$(($S+60)-$s) &&
M=$($M-1);
else
TS=$($S-$s);
fi |

if [ $M -lt $m ]; then
TM=$(($M+60)-$m) &&
H=$($H-1);
else
TM=$($M-$m);
fi |

TH=$($H-$h) ;

$TH":"$TM":"$TS","$TMs;
done >> teste.txt
A lógica acredito que está correta....meu problema é com a sintaxe


Boa noite Gabriela.
Segue a solução:
#!/bin/bash
>RESULT.txt
sed 's/,/:/' tempo.txt > tempo.temp
CP1=$(awk -F":" 'NR==1 {OFS=":"; print $1,$2,$3}' tempo.temp)
CP2=$(awk -F":" 'NR==1 {print $4}' tempo.temp)
DT01=$(bc <<< $(date -d "$CP1.${CP2}" +%s.%3N))
while read -r line;do
DT02=$(date -d "${line:0:8}.${line:9:10}" +%s.%3N)
echo "$DT02 - $DT01 = $(bc <<< "${DT02}-${DT01}")" >> RESULT.txt
done<tempo.temp


OBS.: Se a resposta foi esclarecedora, marque o tópico como resolvido . . .
E para me incentivar a continuar colaborando . . . A minha resposta como A MELHOR . . . :)
NÃO APAGUE o TóPICO, pode ser útil para OUTROS . . .


Interessante:
echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -n '/^[ ]\+Se/,/dou/p')\n" 

Att.:
MarceloOliver



Olá Marcelo, obrigada!

Fiz aqui este que você enviou mas dá esse erro abaixo:


date: data inválida “.”





5. Re: Subtrair horas, minutos, segundos e milisegundos em shell script

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/05/2017 - 19:39h

Gabriela, boa noite.
Aqui funciona a contento....
cat RESULT.txt
1494942697.430 - 1494942697.430 = 0
1494942699.370 - 1494942697.430 = 1.940
1494942700.030 - 1494942697.430 = 2.600
1494942700.670 - 1494942697.430 = 3.240
1494942701.290 - 1494942697.430 = 3.860
1494942701.970 - 1494942697.430 = 4.540
1494942702.600 - 1494942697.430 = 5.170
1494942703.240 - 1494942697.430 = 5.810
1494942703.890 - 1494942697.430 = 6.460
1494942704.520 - 1494942697.430 = 7.090
1494942705.160 - 1494942697.430 = 7.730
1494942705.800 - 1494942697.430 = 8.370
1494942706.430 - 1494942697.430 = 9.000
1494942707.070 - 1494942697.430 = 9.640
1494942707.710 - 1494942697.430 = 10.280


Na linha que define a var "DT01", (linha 6) proteja a var CP1, assim: ${CP1}
Linha alterada: DT01=$(bc <<< $(date -d "${CP1}.${CP2}" +%s.%3N))

Se não resolver:
Como você está executando o scritpt?
Execute o script em modo "DEBUG", e poste a saída.
MODO DEBUG:
Coloque bash -x antes de executar o script.

No aguardo.
mso


6. Re: Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Gabi
GabiS

(usa Ubuntu)

Enviado em 16/05/2017 - 19:59h

Agora foi Marcelo, eram as {} que estavam faltando mesmo... não tinha percebido
Agora estou tentando entender aqui o código porque eu precisaria que a saída do resultado fosse no formato h:m:s:ms e não tudo em milisegundos ...


7. Re: Subtrair horas, minutos, segundos e milisegundos em shell script

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/05/2017 - 20:15h

GabiS escreveu:

Agora foi Marcelo, eram as {} que estavam faltando mesmo... não tinha percebido
Agora estou tentando entender aqui o código porque eu precisaria que a saída do resultado fosse no formato h:m:s:ms e não tudo em milisegundos ...


Aqui no Debian, funciona sem as {}.....
Estou alterando a saida em H:M:S:MS
Daqui a pouco posto.
É isso que quer?
10:51:37:43 - 10:51:37:43 = 0
10:51:37:43 - 10:51:39:37 = 1.940
10:51:37:43 - 10:51:40:03 = 2.600
10:51:37:43 - 10:51:40:67 = 3.240

mso




8. Re: Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Gabi
GabiS

(usa Ubuntu)

Enviado em 16/05/2017 - 20:33h

Esta ok...estou tentando fazer aqui também

Obrigada marcelo e desculpa ficar incomodando


9. Re: Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/05/2017 - 20:54h

GabiS escreveu:

Esta ok...estou tentando fazer aqui também

Obrigada marcelo e desculpa ficar incomodando


O resultado tbem deve ser apresentado no formato hh:mm:ss:ms?

mso



10. Re: Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Gabi
GabiS

(usa Ubuntu)

Enviado em 16/05/2017 - 20:56h

Sim, deve sim


11. Re: Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/05/2017 - 21:11h

GabiS escreveu:

Sim, deve sim


Agora vai . . .
#!/bin/bash
>RESULT.txt
CP1=$(awk -F"[:,]" 'NR==1 {OFS=":"; print $1,$2,$3}' tempo.temp)
CP2=$(awk -F"[:,]" 'NR==1 {print $4}' tempo.temp)
DT01=$(bc <<< $(date -d "$CP1.${CP2}" +%s.%3N))
while read -r line;do
DT02=$(date -d "${line:0:8}.${line:9:10}" +%s.%3N)
RES=$(bc <<< "10800+(${DT02}-${DT01})")
echo "$CP1:$CP2 - $line = $(date -d "@$(bc <<< "10800+(${DT02}-${DT01})")" +%T:%2N)" >> RESULT.txt
done<tempo.temp

cat RESULT.txt
10:51:37:43 - 10:51:37:43 = 00:00:00:00
10:51:37:43 - 10:51:39:37 = 00:00:01:94
10:51:37:43 - 10:51:40:03 = 00:00:02:60
10:51:37:43 - 10:51:40:67 = 00:00:03:24
10:51:37:43 - 10:51:41:29 = 00:00:03:86
10:51:37:43 - 10:51:41:97 = 00:00:04:54
10:51:37:43 - 10:51:42:60 = 00:00:05:17
10:51:37:43 - 10:51:43:24 = 00:00:05:81
10:51:37:43 - 10:51:43:89 = 00:00:06:46

OBS: Se o relógio estiver com o fuso errado, a saída vai variar . . .
Qdo resolvido, não esqueça de marcar A MELHOR RESPOSTA . . . . :)
Att.:
MarceloOliver


12. Re: Subtrair horas, minutos, segundos e milisegundos em shell script [RESOLVIDO]

Gabi
GabiS

(usa Ubuntu)

Enviado em 16/05/2017 - 21:29h

Obrigada por avisar do relógio rs

Obrigada, funcionoou aqui direitinho

Eu estava tentando fazer uma outra coisa, assim:
#!/bin/bash
>RESULT.txt
sed 's/,/:/' "1-sp-C-timestamp.dat" > tempo.temp
CP1=$(awk -F":" 'NR==1 {OFS=":"; print $1,$2,$3}' tempo.temp)
CP2=$(awk -F":" 'NR==1 {print $4}' tempo.temp)
DT01=$(bc <<< $(date -d "${CP1}.${CP2}" +%s.%3N))
while read -r line;do
DT02=$(date -d "${line:0:8}.${line:9:10}" +%s.%3N)

total=$(bc <<< "${DT02}-${DT01}")
ms=$(($total%1000))
s_aux=$((total/1000))
s=$(($s_aux%60))
m_aux=$(($s_aux/60))
m=$(($m_aux%60))
h=$(($m_aux}/60))

echo "$h":"$m":"$s":"$ms" >> RESULT.txt
done <tempo.temp


mas eu estava tentando entender o bc para utilizar no calculo que estava fazendo....nooossa estou muito atrasada né...vejo que tenho muito que aprender rs :/

Mais uma vez obrigada



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts