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 -i
opção em vez de -e
.
- o
s
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ãos/^./$files&/
diz para substituir o primeiro caractere pelo nome do arquivo antes do primeiro caracteres/./&-/4
usa obandeira numérica4
para substituir o 4º caractere (a 4ª correspondência de.
) por-
depois do 4º caracteres/./&-/7
substitua 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.txt
comT
es/ -> / /
substitui->
por um único espaço em branco.
Esta é a saída:
2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528