Extrahieren Sie Werte aus dem Dateinamen und fügen Sie sie einer Textdatei hinzu

Extrahieren Sie Werte aus dem Dateinamen und fügen Sie sie einer Textdatei hinzu

Ich habe gerasterte Modelldaten (getrennt nach unterschiedlicher Tiefe) in Textdateien gespeichert. Die Struktur ist wie folgt:

Formatjeder Spalte in einer Zeile in der Textdatei:

x_coordinate y_coordinate density

Jede Textdatei enthält etwa 400 x 400 Punkte (als Ebene einer bestimmten Tiefe).

Dateiname:

dep###

Hier ###stellt eine Zahl die Tiefe (in Z-Richtung) dar. Die Zahl kann eine Ganzzahl oder ein Bruch sein. Ich habe jetzt beispielsweise diese Dateien: „dep0“, „dep0.5“, „dep10“, „dep300“, das heißt, diese Daten sind 400*400 gerasterte Daten in xy-Ebenenform für die Tiefen 0, 0,5, 10 und 300.

Nun möchte ich die Zahl im Dateinamen (also die Tiefe) nehmen und sie der dritten Spalte jeder Zeile hinzufügen und sie alle miteinander kombinieren. Außerdem sollte die Tiefe von Minimum zu Maximum sortiert werden. Die Ausgabedatei sollte also (zum Beispiel) so aussehen:

x_coordinate y_coordinate z_coordinate density
0            0            0            2.5
0            1            0            2.5
...          ...          0            2.6
400          400          0            2.9
0            0            0.5          2.8
...          ...          0.5          2.9
0            0            10           3.2
...          ...          10           3.3
...          ...          300          4.7
...          ...          300          4.8

Zuerst habe ich es mit diesem Skript gemacht:

for((i=$depmin;i<=$depmax;i++))
do
 if [ -f "xyp/dep"$i ];then
  awk '{print $1, $2,'$i',$3}' "xyp/dep"$i >> "xyzp/area1"
 fi
done

Dann stelle ich fest, dass alle Dateien fehlen würden, deren Tiefe nicht ganzzahlig ist, da dieVariable $iin der forSchleife in jeder Runde um 1 erhöhen.

sedIch habe versucht , und zu verwenden find -exec, aber ich habe immer wieder Fehler erhalten. Das Problem für mich besteht darin, dass ich nicht ganz verstehe, wie ich $, '', <<<richtig verwende, um den Wert an eine andere Funktion umzuleiten oder weiterzuleiten awk. Bitte helfen Sie mir bei diesem Problem.

=====================

Ich habe mir dieses Skript ausgedacht:

depnumbers=$(ls xyp | sed -e 's/dep//g' |sort -n)
filecount=$(ls xyp | wc -l)

for((i=1;i<=$filecount;i++))
 do
  dep=$(awk '{print $'$i'}' <<< $depnumbers)
  awk '{print $1, $2,'$dep',$3}' "xyp/dep"$dep >> "xyzp/area1"
 done

Es funktioniert einwandfrei. Gibt es eine Möglichkeit, dieses Skript für solche Aufgaben zu vereinfachen oder zu verbessern? Eigentlich bin ich neu bei Bash und denke immer noch, dass etwas nicht stimmt ... nicht sicher

Antwort1

Um nur Zahlen zur Datei hinzuzufügen.

awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' xyp/dep* > "xyzp/area1"

Zum Sortieren nach Zahlen.

ls -1v xyp/dep* | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"

Zum Sortieren ab Minuszahlen.

 ls xyp/dep* | sort -t 'p' -k 3 -n | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"

pDadurch wird das Zeichen als Trennzeichen betrachtet und die Funktion sort -nwirkt sich nur auf die folgenden Zahlen aus.

verwandte Informationen