¿Cómo insertar el nombre del archivo cambiando el formato al mismo archivo?

¿Cómo insertar el nombre del archivo cambiando el formato al mismo archivo?

Tengo muchos archivos. El formato de archivo es año (4 dígitos) mes (2 dígitos) día (2 dígitos)

Nombres de archivos de muestra:

  • 20150101.txt
  • 20150102.txt

Contenido de nombres de archivos de muestra

00:00:13 -> 001528

Quiero extraer datos como fecha del nombre del archivo y luego insertarlos en el archivo.

Salida deseada

2015-01-01T00:00:13 001528

o

2015-01-01 00:00:13 001528

Probé uno de los siguientes códigos

for files in *txt; do
awk -F "->" 'BEGIN{OFS=""} {print FILENAME" ",$1, $2}' <$files > $files.edited
mv $files.edited $files
done

Por favor guía.

Respuesta1

Si tienes GNU awk ( gawk), entonces puedes usar su versión incorporada.Funciones de tiempopara convertir partes del nombre del archivo y el contenido en una época y luego convertirlo de acuerdo con el formato elegido.

Ex. dado

$ cat 20150101.txt 
00:00:13 -> 001528

Entonces

$ awk -F ' -> ' '
    split($1,a,/:/) {
      ds = sprintf("%04d %02d %02d %02d %02d %02d", substr(FILENAME,1,4), substr(FILENAME,5,2), substr(FILENAME,7,2), a[1], a[2], a[3]); 
      $1 = strftime("%FT%T", mktime(ds))
    } 
    1
  ' 20150101.txt 
2015-01-01T00:00:13 001528

Respuesta2

Esto le dará el resultado deseado usando sed:

for files in *.txt; do
sed -e "s/^./$files&/;s/./&-/4;s/./&-/7;s/.txt/T/;s/ -> / /" "$files"
done

Para insertar realmente cada salida en cada archivo, no necesita redirigir como lo hizo en su bucle. Simplemente puedes usar la -iopción en lugar de -e.

  • els comando (sustituto)utiliza la siguiente sintaxis:s/regexp/replacement/flags
  • .coincide con cualquier carácter y ^.coincide con el primer carácter de una línea
  • & referencias anteriorestoda la porción coincidente del espacio del patrón
  • s/^./$files&/dice sustituir el primer carácter con el nombre del archivo antes del primer carácter
  • s/./&-/4utiliza elbandera numérica 4para sustituir el cuarto carácter (la cuarta coincidencia de .) con -después del cuarto carácter
  • s/./&-/7reemplace el séptimo carácter -después del séptimo carácter (tenga en cuenta que el sexto carácter se convierte en el séptimo carácter después de insertarlo -después del cuarto carácter).

Y por supuesto,

  • s/.txt/T/sustituye .txtcon Ty
  • s/ -> / /sustituye ->con un solo espacio en blanco.

Esta es la salida:

2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528

información relacionada