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)
我怀疑这可以实现,但我不知道如何实现。
使用 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 以匹配您感兴趣的任何文件,并且标题将适应(适应处理的第一个文件)。