從文件名和文件內容中提取訊息

從文件名和文件內容中提取訊息

我產生了一堆文件,其中都只包含一個數字。然後我在每個文件名中都有一些有關這些文件的資訊。我想要做的是將所有文件內容收集為新文件中的一列,然後將每個文件名的某些部分作為此新文件中的單獨列獲取。

檔案名稱如下: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 以匹配您感興趣的任何文件,並且標頭將進行調整(適應第一個處理的文件)。

相關內容