Sí, antes de que alguien salte y me ataque con una horca, esta es una pregunta duplicada, pero las otras no funcionan para mí, así que ahora me lo pregunto.
Tengo un archivo CSV que tiene fechas en algún lugar de cada entrada. La dificultad añadida a la conversión es que a veces las fechas tendrán un solo dígito por días. Entradas de ejemplo:
abc,0,2,-2,3-16-1994
xyz,1,2,3,10-09-1994
Quiero algo, preferiblemente sed, para convertir esas entradas de datos para que se vean así:
abc,0,2,-2,1994-03-16
xyz,1,2,3,1994-09-10
He intentado:
sed 's|(..)-(..)-(....)|\3-\2-\1|'
Pero eso da un error y realmente no cubre los problemas del día de un solo dígito.
También probé:
awk -F - '{print $3$2$1}'
Esto en realidad tiene un efecto deseado, pero de nuevo, no realmente. El comando awk lo convierte, pero solo el mes y el año, y en lugar de volver a poner la fecha donde estaba, pone el mes y el año del comienzo de la línea, dejando la parte del día donde estaba originalmente.
¡Cualquier ayuda sería increíble!
Gracias por adelantado.
Editar
Se señaló acertadamente en los comentarios que cometí un error con mis ejemplos. Las fechas deben ser:
abc,0,2,-2,16-03-1994
xyz,1,2,3,2-05-1994
Con el resultado deseado siendo:
abc,0,2,-2,1994-03-16
xyz,1,2,3,1994-05-02
Lo siento chicos.
Respuestas:
sed -r 's/(\d{1,2})-([0-9]{2})-([0-9]{4})/\3-\2-\1/g'
parece hacer el truco, puede haber otras formas "más inteligentes" ... No sémi código:
produce:
2 "advertencias" para sus datos ... es un poco inconsistente (tal vez fue solo por el bien del ejemplo) ...
dd-mm-yyyy
omm-dd-yyyy
Edición posterior: Primero me perdí la parte de que el relleno del día era un requisito, teniendo esto en cuenta, parece que lo siguiente ayuda
prácticamente tenemos 2 expresiones regulares, una (la primera) coincide con las "fechas" donde el día tiene solo 1 dígito y agrega el relleno "0" al hacer la sustitución, la otra coincide con las "fechas" que tienen el día con 2 dígitos y solo el reordenamiento de los elementos
Tengo la idea de aquí https://stackoverflow.com/questions/12129382/add-leading-0-in-sed-substitution , así que felicitaciones a la persona que respondió allí
fuente
3
en la entrada se convierte03
en la salida.s/\b([0-9]{1,2}-)([1-9]-[0-9]{4})\b/\10\2/;
al comienzo de lased
cadena de comando, también manejará meses de un solo dígito.sed --version
dicesed (GNU sed) 4.2.2
,sed --help
da-r, --regexp-extended use extended regular expressions in the script.
. En otros servidores (algunos debian y centos) encontré la versión 4.2.1, y todavía funciona así que ... tal vez no fue un error tipográfico en el comentarioEsto funciona cuando lo pruebo, tenga en cuenta que he cambiado día y mes ya que el formato original en su ejemplo es en realidad mm-dd-aaaa. No estoy seguro de si el relleno cero es importante para usted o no, no lo he intentado:
fuente