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 -i
opción en lugar de -e
.
- el
s
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óns/^./$files&/
dice sustituir el primer carácter con el nombre del archivo antes del primer carácters/./&-/4
utiliza elbandera numérica4
para sustituir el cuarto carácter (la cuarta coincidencia de.
) con-
después del cuarto carácters/./&-/7
reemplace 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.txt
conT
ys/ -> / /
sustituye->
con un solo espacio en blanco.
Esta es la salida:
2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528