У меня есть файл csv, который имеет много строк временных меток в следующем формате HH: MM: SS: MS
Например:
00.00.07.38 00.00.08.13 00.00.08.88
Этот час не имеет отношения ко мне, поэтому я хотел бы его отрезать. Как удалить HH из каждой строки файла с помощью bash.
Я могу читать строки за строкой из файла
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
Я играл с awk
и cut
но смог распечатать определенную позицию ex HH и т. Д.
Но как удалить только HH из строки без создания нового файла?
Просто используйте sed
:
sed -i.bak 's/[0-9]\{2\}.//' myfile
Это приведет к удалению двух стартовых цифр, за которыми следует период, и заменит ваш файл, сохранив оригинал в качестве резервной копии ( myfile.bak
).
Возможно, это не лучшее решение, но оно работает
Я просто создаю tempfile, который позже переименовал в исходное имя файла.
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
Вы были почти там со своим сценарием:
file=filename while IFS=. read hmsn do echo "$m.$s.$n" done < "$file"
Использование IFS
как точки ( .
) Позволяет считывать раздельные данные ( < "$file"
) по частям. Части присваиваются h, m, s и n. Затем мы просто печатаем нужные детали. Фактически, более простым решением будет:
file=filename while IFS=. read hm do echo "$m" done < "$file"
Переменная h принимает первую часть, переменная m принимает остальное, а затем просто печатает ее.