我生成了一堆文件,其中都只包含一个数字。然后我在每个文件名中都有一些有关这些文件的信息。我想要做的是将所有文件内容收集为新文件中的一列,然后将每个文件名的某些部分作为此新文件中的单独列。
文件名如下所示: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 以匹配您感兴趣的任何文件,并且标头将进行调整(适应第一个处理的文件)。