Extrahieren Sie Informationen sowohl aus dem Dateinamen als auch aus dem Inhalt der Datei

Extrahieren Sie Informationen sowohl aus dem Dateinamen als auch aus dem Inhalt der Datei

Ich habe eine Reihe von Dateien generiert, die alle nur eine Nummer enthalten. In jedem Dateinamen habe ich dann einige Informationen zu diesen Dateien. Ich möchte alle Dateiinhalte als Spalte in einer neuen Datei sammeln und dann einen Teil jedes Dateinamens als separate Spalten in dieser neuen Datei erhalten.

Die Dateinamen sehen folgendermaßen aus: traj-num1-iter-num2-states-num3.gradient, wobei num1, num2 und num3 einfach unterschiedliche Zahlen sind. Ein Beispiel für das, was ich will:

$ cat traj-10-iter-220-states-01.gradient
-0.0014868599999999788

$ cat newfile
traj    iter     states    gradient
10      220      01        -0.0014868599999999788

Ich vermute, dass dies erreicht werden kann, aber ich weiß nicht wie.

Antwort1

Verwenden der AWK- FILENAMEVariable:

awk 'BEGIN { OFS = "\t"; print "traj", "iter", "states", "gradient"; FS="-|\\." } { gradient=$0; $0=FILENAME; print $2, $4, $6, gradient }' traj-*-iter-*-states-*.gradient

gibt die angeforderte Kopfzeile aus und verarbeitet dann jede traj-*-iter-*-states-*.gradientDatei und gibt die aus ihrem Dateinamen und ihrem Inhalt extrahierten Werte aus.

Die folgende Variante, basierend auf einerAnregungvonOlivier Dulac, extrahiert die Kopfzeile aus dem Dateinamen und verwendet eine einfachere Version von 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

Sie können den Glob am Ende so ändern, dass er mit den gewünschten Dateien übereinstimmt, und der Header wird (an die erste verarbeitete Datei) angepasst.

verwandte Informationen