У меня есть ряд файлов CSV, второе поле которых является датами:
R.OUSE BOURTON MILL,2000-03-22T14:50:00,Ammoniacal Nitrogen as N,0.03,mg/l
Как я могу изменить формат даты в DD/MM/YYYY для всех файлов? Измерительное время не нужно.
Огромное спасибо
С мельником, с помощью его встроенного strptime
и strftime
функции:
$ mlr --fs ',' --ocsvlite --headerless-csv-output put '
$2 = strftime(strptime($2,"%Y-%m-%dT%H:%M:%S"),"%d/%m/%Y")
' file.csv
R.OUSE BOURTON MILL,22/03/2000,Ammoniacal Nitrogen as N,0.03,mg/l
Вот разумное использование решения bash
и date
:
#!/bin/bash
IFS=,
while read -r line; do
fields=($line) # Split string into fields
fields[1]=$(date --date="${fields[1]}" +%d/%m/%Y) # Transform the second date
echo "${fields[*]}" # Reassemble fields
done <file.csv >>output.csv
Почему удар?
Из командной строки:
sed -E 's,([0-9]{4})-([0-9]{2})-([0-9]{2}),\3/\2/\1,g' test
Результат:
R.OUSE BOURTON MILL,22/03/2000T14:50:00,Ammoniacal Nitrogen as N,0.03,mg/l
Соответствие и компоненты времени перестроения с awk gensub.
$ awk 'BEGIN {FS=OFS=","} {$2=gensub(/(.+)-(.+)-(.+)T.*/,"\\3/\\2/\\1","g",$2)} 1' file.csv # >> output.csv
(nawk версия):
$ awk 'BEGIN {FS=OFS=","} {split(substr($2,0,10),a,"-"); $2=sprintf("%s/%s/%s",a[3],a[2],a[1])} 1' file.csv # >> output.csv
если намерение состоит в том, чтобы только преобразовать формат времени, то эпоха является, вероятно, лучшим выбором.
#!/usr/bin/awk -f
#
# example.awk
#
BEGIN {
FS=OFS=","
} {
split(substr($2,0,10),a,"-")
$2=mktime(sprintf("%s %s %s %s %s %s",a[1],a[2],a[3],00,00,00))
} 1
$ awk -f example.awk file.csv # >> output.csv