ファイル名とファイルの内容の両方から情報を抽出します

ファイル名とファイルの内容の両方から情報を抽出します

1 つの数字だけを含む多数のファイルを生成しました。各ファイル名には、これらのファイルに関する情報が含まれています。やりたいことは、すべてのファイル コンテンツを新しいファイルの列として収集し、各ファイル名の一部をこの新しいファイルの個別の列として取得することです。

ファイル名は次のようになります: 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 を変更すると、ヘッダーが (処理される最初のファイルに) 適応されます。

関連情報