
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 FILENAME
a 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-*.gradient
arquivo, 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).