Extrai informações do nome do arquivo e do conteúdo do arquivo

4

Eu gerei um monte de arquivos que contêm apenas um número. Eu então tenho algumas informações sobre esses arquivos em cada nome de arquivo. O que eu quero fazer é coletar todo o conteúdo do arquivo como uma coluna em um novo arquivo e, em seguida, obter uma parte de cada nome de arquivo como colunas separadas nesse novo arquivo.

Os nomes dos arquivos são assim: traj-num1-iter-num2-states-num3.gradient , onde num1, num2 e num3 são números diferentes. Um exemplo do que eu quero:

$ cat traj-10-iter-220-states-01.gradient
-0.0014868599999999788

$ cat newfile
traj    iter     states    gradient
10      220      01        -0.0014868599999999788

Eu suspeito que isso possa ser alcançado, mas eu não sei como.

    
por Yoda 24.04.2017 / 13:23

1 resposta

9

Usando a variável FILENAME do AWK:

awk 'BEGIN { OFS = "\t"; print "traj", "iter", "states", "gradient"; FS="-|\." } { gradient=$0; $0=FILENAME; print $2, $4, $6, gradient }' traj-*-iter-*-states-*.gradient

exibirá a linha de cabeçalho solicitada, processará cada arquivo traj-*-iter-*-states-*.gradient , exibindo os valores extraídos de seu nome de arquivo e seu conteúdo.

A seguinte variante, baseada em um sugestão Olivier Dulac , extratos a linha de cabeçalho do nome do arquivo e usa uma versão mais simples de FS :

awk 'BEGIN { OFS = "\t"; FS="[-.]" } { contents=$0; $0=FILENAME; if (!header) { print $1, $3, $5, $7; header=1 }; print $2, $4, $6, contents }' traj-*-iter-*-states-*.gradient

Você pode alterar o glob no final para corresponder aos arquivos nos quais tem interesse, e o cabeçalho será adaptado (ao primeiro arquivo processado).

    
por 24.04.2017 / 13:28