
我產生了一堆文件,其中都只包含一個數字。然後我在每個文件名中都有一些有關這些文件的資訊。我想要做的是將所有文件內容收集為新文件中的一列,然後將每個文件名的某些部分作為此新文件中的單獨列獲取。
檔案名稱如下: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 以匹配您感興趣的任何文件,並且標頭將進行調整(適應第一個處理的文件)。