У меня есть дата, записанная в файле CSV как 19.10.2014. Я хочу, чтобы она была в формате 19-Oct-2014.

Вы можете сделать это путем определения задания, которое запускается каждый час в течение часа и спит в течение произвольного времени перед запуском команды, которая вас действительно интересует. В вашем crontab:

SHELL=/bin/bash

0 * * * * sleep $((RANDOM*3600/32768)) && command

(Вам необходимо указать оболочку, чтобы гарантировать, что $ RANDOM доступен. Есть другие способы получить случайное значение для сна , если это не подходит.)

1
12.10.2018, 12:22
5 ответов

El comando datepuede formatearlo por usted:

date -d "2014-10-19" +%d-%b-%Y

que produce

19-Oct-2014

Si proporciona líneas de muestra de su archivo, podemos escribirlo por usted.

Una forma es usandoawk:

echo zzz,19/10/2014,aaa,bbb | awk -F, '{split($2,dateelem,"/"); cmd = "date -d " dateelem[3] "-" dateelem[2] "-" dateelem[1] " +%d-%b-%Y"; cmd | getline date; OFS=","; $2=date; print; close(cmd)}'

que da

zzz,19-Oct-2014,aaa,bbb

Suponiendo aquí que desea modificar el segundo campo. Ajuste "split($2,dateelem,"/");"en el script awkpara cambiar el campo (columna )número en el que aparece su fecha

3
28.04.2021, 23:50

Una solución completamente en GNU awk es la siguiente:

awk '{ split($0,slt,"/");datspec=mktime(slt[3]" "slt[2]" "slt[1]" 00 00 00");print strftime("%d-%b-%Y",datspec) }' <<< "19/10/2014"

Tomando la fecha como entrada, primero dividimos los datos en una matriz (slt )para obtener la fecha, el mes y el año. Luego usamos la función mktime de awk para obtener una especificación de fecha que luego usa la función sttftime de awk para obtener la fecha en el formato correcto.

Con un csv, $0 sería el número correspondiente al campo delimitado por comas que tiene la fecha.

2
28.04.2021, 23:50

perl puede hacerlo, pero en realidad no es para principiantes. Sin embargo, el análisis de fechas se maneja mejor mediante bibliotecas de manejo de fechas adecuadas. perl tiene uno en la caja, Tiempo ::Pieza

$ cat file
a,b,19/10/2014,d

$ perl -MTime::Piece -F, -lane '
    $F[2] = Time::Piece->strptime($F[2], "%d/%m/%Y")->strftime("%d-%b-%Y");
    print join ",", @F
' file
a,b,19-Oct-2014,d
0
28.04.2021, 23:50

Lo he hecho con el siguiente método

comando

 j=`date -d "2014/10/19" +%b`;echo "19/10/2014" | awk -v j="$j" -F "/"  '{print $1"-"j"-"$3}'

Salida

19-Oct-2014
0
28.04.2021, 23:50

Otro awkenfoque.Utiliza la funcionalidad básica awk, por lo que es probable que funcione con implementaciones que no sean -GNU.

$ cat infile
foo,19/10/2014,bar
foo2,19/01/2015,bar2
$ awk -F, '{print $1","substr($2,0,2)"-"substr("JanFebMarAprMayJunJulAugSepOctNovDec",substr($2,4,2)*3-2,3)"-"substr($2,7,4)","$3}' infile
foo,19-Oct-2014,bar
foo2,19-Jan-2015,bar2
$
0
28.04.2021, 23:50

Теги

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