Как сделать сценарий Bash для изменения формата даты в файле CSV

У меня есть ряд файлов CSV, второе поле которых является датами:

R.OUSE BOURTON MILL,2000-03-22T14:50:00,Ammoniacal Nitrogen as N,0.03,mg/l

Как я могу изменить формат даты в DD/MM/YYYY для всех файлов? Измерительное время не нужно.

Огромное спасибо

4
задан 20 October 2019 в 02:00

4 ответа

С мельником, с помощью его встроенного 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
6
ответ дан 1 December 2019 в 08:58

Вот разумное использование решения 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
2
ответ дан 1 December 2019 в 08:58

Почему удар?

Из командной строки:

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
1
ответ дан 1 December 2019 в 08:58

Соответствие и компоненты времени перестроения с 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
1
ответ дан 1 December 2019 в 08:58

Другие вопросы по тегам:

Похожие вопросы: