从文件名和文件内容中提取信息

从文件名和文件内容中提取信息

我生成了一堆文件,其中都只包含一个数字。然后我在每个文件名中都有一些有关这些文件的信息。我想要做的是将所有文件内容收集为新文件中的一列,然后将每个文件名的某些部分作为此新文件中的单独列。

文件名如下所示:traj-num1-iter-num2-states-num3.gradient,其中 num1、num2 和 num3 只是不同的数字。我想要的一个例子:

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

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

我怀疑这是可以实现的,但我不知道如何实现。

答案1

使用AWK的FILENAME变量:

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

将输出请求的标题行,然后处理每个traj-*-iter-*-states-*.gradient文件,输出从文件名及其内容中提取的值。

以下变体基于建议经过奥利维尔·杜拉克,从文件名中提取标题行并使用更简单的版本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

您可以更改末尾的 glob 以匹配您感兴趣的任何文件,并且标头将进行调整(适应第一个处理的文件)。

相关内容