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

Yod*_*oda 4 scripting text-processing filenames

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

文件名如下所示: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
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*itt 9

使用 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
Run Code Online (Sandbox Code Playgroud)

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

以下变体基于Olivier Dulac建议,从文件名中提取标题行并使用更简单的 版本: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
Run Code Online (Sandbox Code Playgroud)

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