Como inserir o nome do arquivo alterando o formato para o mesmo arquivo?

Como inserir o nome do arquivo alterando o formato para o mesmo arquivo?

Eu tenho muitos arquivos. O formato do arquivo é ano(4 dígitos)mês(2 dígitos)dia(2 dígitos)

Exemplos de nomes de arquivos:

  • 20150101.txt
  • 20150102.txt

Conteúdo de nomes de arquivos de amostra

00:00:13 -> 001528

Quero extrair dados como data do nome do arquivo e depois inseri-los no arquivo

Saída desejada

2015-01-01T00:00:13 001528

ou

2015-01-01 00:00:13 001528

Eu tentei um dos códigos abaixo

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

Por favor, oriente.

Responder1

Se você tiver o GNU awk ( gawk), poderá usar seu software integradoFunções de tempopara converter partes do nome e conteúdo do arquivo em uma época e, em seguida, convertê-lo de acordo com o formato escolhido.

Ex. dado

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

Então

$ 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

Responder2

Isso lhe dará a saída desejada usando sed:

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

Para realmente inserir cada saída em cada arquivo, você não precisa redirecionar como fez no seu loop. Você pode simplesmente usar a -iopção em vez de -e.

  • os comando (substituto)usa a seguinte sintaxe:s/regexp/replacement/flags
  • .corresponde a qualquer caractere e ^.corresponde ao primeiro caractere de uma linha
  • & referências anteriorestoda a parte correspondente do espaço padrão
  • s/^./$files&/diz para substituir o primeiro caractere pelo nome do arquivo antes do primeiro caractere
  • s/./&-/4usa obandeira numérica 4para substituir o 4º caractere (a 4ª correspondência de .) por -depois do 4º caractere
  • s/./&-/7substitua o 7º caractere por -após o 7º caractere (observe que o 6º caractere se torna o 7º caractere após a inserção -após o 4º caractere).

E claro,

  • s/.txt/T/substitutos .txtcom Te
  • s/ -> / /substitui ->por um único espaço em branco.

Esta é a saída:

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

informação relacionada