Remove uma parte específica da linha

1

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?

    
por S4M11R 14.11.2016 / 15:01

3 respostas

0

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 ).

    
por 14.11.2016 / 15:11
0

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
    
por 14.11.2016 / 15:14
0

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.

    
por 14.11.2016 / 21:35

Tags