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

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

Eu gerei vários arquivos que contêm apenas um número. Tenho então 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 parte de cada nome de arquivo como colunas separadas neste novo arquivo.

Os nomes dos arquivos são assim: traj-num1-iter-num2-states-num3.gradient, onde num1, num2 e num3 são apenas 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

Suspeito que isso possa ser alcançado, mas não sei como.

Responder1

Usando FILENAMEa variável 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

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

A seguinte variante, baseada em umsugestãoporOliver Dulac, extrai 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 de seu interesse, e o cabeçalho se adaptará (ao primeiro arquivo processado).

informação relacionada