
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- FILENAME
Variable:
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-*.gradient
Datei 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.