Extrahieren Sie einen Wert aus einer Textdatei an einer bestimmten Position

442
Vito Genna

Ich habe eine Datei, die Tonnen von Informationen enthält. Es sieht aus wie das:

===============================================================================   NSTEP ENERGY RMS GMAX NAME NUMBER 52 -4.8969E+05 5.1393E+00 1.7327E+03 P1 31  BOND = 29534.6906 ANGLE = 2139.5547 DIHED = 9235.7381 VDWAALS = 51148.8783 EEL = -595288.4773 HBOND = 0.0000 1-4 VDW = 2741.3848 1-4 EEL = 26043.4789 RESTRAINT = 29.3591 DFTBESCF= -15274.2075 EAMBER = -489718.9594 NMR restraints: Bond = 0.000 Angle = 0.000 Torsion = 0.000 =============================================================================== 

Jetzt möchte ich den Wert (und nur in eine Spalte einfügen) aus der Spalte "Energie" (oder der zweiten Spalte) in der Zeile direkt unter dem Wort (hier als -4.8969E + 05 dargestellt) extrahieren ENERGY.

Ich habe versucht, es mit zu extrahieren, konnte es grepaber nicht.

1
Ich habe deine Frage etwas lesbarer gemacht. Nehmen Sie es als Beispiel und verbessern Sie es gegebenenfalls weiter. Insbesondere: Gehören diese `===` zur Datei? gehören sie dazu? Bitte beachten Sie auch, dass wir kein Scriptwriting-Service sind. Was hast du bisher versucht? Kamil Maciorowski vor 5 Jahren 0
Klicken Sie oben links auf "Bearbeiten" und fügen Sie dem ursprünglichen Beitrag das hinzu, wonach wir gefragt haben. Ist die Datei, aus der Sie versuchen, aus der Tabelle zu extrahieren, trennen -Zeichen die Spalten oder sind sie durch mehrere Leerzeichen getrennt? Wenn Sie eine Beispieldatei an einen anderen Ort wie Google Drive hochladen und die URL freigeben können, damit wir sie möglicherweise herunterladen, könnte dies die Auflösung beschleunigen. Bitte geben Sie auch an, was Sie bisher mit grep versucht haben. Es ist für uns viel einfacher, ein defektes Skript zu reparieren, als von Grund auf zu schreiben. K7AAY vor 5 Jahren 0
Wenn die Datei nur Leerzeichen enthält (keine Tabulatoren, keine Leerzeichen), sollten Sie in der Lage sein, die gewünschten Spalten mit `cut -c MN` zu extrahieren, mit zusätzlichen Filtern, um die nicht spaltenförmigen Daten zu entfernen. AFH vor 5 Jahren 0

1 Antwort auf die Frage

0
G-Man

Sie scheinen zu sagen: "Ich möchte das zweite Feld aus der Zeile unmittelbar nach der Zeile, die das Wort enthält ENERGY (in dem ENERGYsich das zweite Feld befindet)." Wenn Sie das möchten, können Sie es mit machen

awk '/ENERGY/ { found_it=1; next; } found_it { print $2; found_it=0; }' 

(Geben Sie Ihren Dateinamen am Ende dieses Befehls ein - direkt nach dem }'- oder leiten Sie Ihre Daten in den obigen Befehl.)

Dies einfach

  • Sucht nach einer Zeile, die die Zeichenfolge enthält ENERGY.
    • setzt ein Flag ( found_it), wenn dies der Fall ist,
    • und überspringt diese Zeile.
  • Wenn es auf eine Zeile trifft und das found_itFlag gesetzt ist, bedeutet dies, dass die vorherige Zeile enthalten ist ENERGY, also
    • das zweite Wort aus dieser Zeile ausgeben und
    • Lösche (Null) das found_itFlag, damit wir keine Ausgabe von nachfolgenden Zeilen erzeugen.

Wenn Ihre Datei die ENERGYZeilen 4, 14 und 24 enthält, wird der zweite Befehl aus den Zeilen 5, 15 und 25 mit dem obigen Befehl gedruckt. Wenn Sie dies nicht wünschen, ist dies ein einfacherer Ansatz

awk '/ENERGY/ { found_it=1; next; } found_it { print $2; exit; }' 

Dies ist dasselbe wie das erste, außer dass das zweite Feld aus Zeile 5 gedruckt wird und es nicht mehr aussieht. Auch wenn es ENERGYnur einmal in der Datei vorkommt, ist dieser Ansatz vorzuziehen, da nicht die gesamte Datei gelesen werden muss, sondern nur bis zu dem gewünschten Wert.

Diese Befehle werden:

  • finden Sie die Zeichenfolge, ENERGYauch wenn es Teil eines größeren Wortes, wie ist CENERGY, ENERGY-CONSUMING, ENERGYLEVELoder HIGH-ENERGY.
  • find den String, ENERGY auch wenn er nicht das zweite Feld in seiner Zeile ist.
  • Druckt den Wert des zweiten Feldes, nicht das Feld, in dem er gefunden wurde ENERGY.
  • nicht findenEnergyoderenergy.
  • scheitern, wenn ENERGYin der letzten Zeile ist.

Wenn dies Probleme sind, bearbeiten Sie Ihre Frage, um Ihre Anforderungen anzugeben.

Es funktioniert sehr gut! Ich wurde verrückt mit awk! Vielen Dank für Ihre wertvolle Arbeit und Zeit! Du hast meinen Tag gerettet! :) Vito Genna vor 5 Jahren 0