Use apenas sed
:
sed -i.bak 's/[0-9]\{2\}.//' myfile
Isso removerá os dois dígitos iniciais quando seguido por um ponto e substituirá o arquivo, salvando o original como um backup ( myfile.bak
).
Eu tenho um arquivo csv que tem muitas linhas de carimbos de data / hora no seguinte formato HH: MM: SS: MS
Por exemplo:
00.00.07.38
00.00.08.13
00.00.08.88
A hora não é relevante para mim, então eu gostaria de encerrar. Como faço para remover HH de todas as linhas no arquivo com bash.
Eu posso ler linha por linha a partir do arquivo
while IFS=, read col1
do
#remove HH from every line
#awk -F '[.]' '{print $1}' <<< $col1 #only prints one portion of time
#echo $col1 | cut -d"." -f2 | cut -d"." -f3 | cut -d"." -f4
done < $file
Eu tenho jogado com awk
e cut
, mas só consegui imprimir uma posição específica ex HH etc
Mas como remover apenas o HH da linha sem criar um novo arquivo?
Use apenas sed
:
sed -i.bak 's/[0-9]\{2\}.//' myfile
Isso removerá os dois dígitos iniciais quando seguido por um ponto e substituirá o arquivo, salvando o original como um backup ( myfile.bak
).
Talvez não seja a melhor solução, mas funciona
Acabei de criar um arquivo temporário que mais tarde renomeie para o nome do arquivo original.
function fixTime() {
file="zipstream_test/timeLog.csv"
tmpFile="zipstream_test/timeTmp.csv"
#Remove HH from file, ie remove first 3 chars
sed 's/^.\{3\}//g' $file > $tmpFile
rm $file
mv $tmpFile $file
}
fixTime
Você estava quase lá com o seu script:
file=filename
while IFS=. read h m s n
do echo "$m.$s.$n"
done < "$file"
O uso de IFS
como um ponto ( .
) permite que a leitura divida a entrada ( < "$file"
) em partes. As partes são atribuídas a h, m, s e n. Então nós apenas imprimimos as partes que são necessárias. Na verdade, uma solução mais fácil será:
file=filename
while IFS=. read h m
do echo "$m"
done < "$file"
A variável h pega a primeira parte, a variável m pega o resto, depois apenas imprime.