Wie erhalte ich die zweite Spalte aus der Befehlsausgabe?

Die Ausgabe meines Befehls lautet wie folgt:

 N O D E O U T P U T THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT NODE FOOT- NT11 NOTE 3 20.00 11 20.00 1003 23.75 1011 23.75 2003 27.52 2011 27.52 3003 31.30 3011 31.30 4003 35.08 4011 35.08 5003 38.87 5011 38.87 6003 42.67 6011 42.67 7003 46.48 7011 46.48 8003 50.29 8011 50.29 9003 54.12 9011 54.12 10003 57.95 10011 57.95 11003 61.79 11011 61.79 12003 65.64 12011 65.64 13003 69.50 13011 69.50 14003 73.37 14011 73.37 15003 77.25 15011 77.25 16003 81.14 

Die erste Spalte lautet Immer eine Zahl. Mein Zweck ist es, nur die zweite Spalte zu erhalten, wie:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Ich wollte

um dies zu erreichen. Die Ausgabe ist jedoch durcheinander: (nur ein Wert 20.00) 20.00

Wie erhalte ich den Wert der zweiten Spalte? (In meinem Fall habe ich 405 Zeilen, die 405 Werten mit 1 Spalte entsprechen.)

Kommentare

  • Wenn der Header eine feste Länge hat, können Sie ihn entfernen mit nur tail und dann für die andere Spalte. Ich ' würde vorschlagen, beim Einrücken von Code vorsichtig zu sein. Das Snippet in der Frage ist ziemlich schwer zu interpretieren, da Einrückung und geschweifte Klammern nicht übereinstimmen.

Antwort

Angenommen, es reicht aus, um in der ersten Spalte nach einer Ziffer zu suchen:

awk "$1 ~ /[0-9]/ { print $2 }" data.in >data.out 

Um sicherzustellen, dass dies nur auf Zeilen nach der Zeile NSET_OUTPUT angewendet wird, können Sie Folgendes tun:

sed "1,/NSET_OUTPUT/d" data.in | awk "$1 ~ /[0-9]/ { print $2 }" >data.out 

Dadurch werden Zeilen vor NSET_OUTPUT gelöscht und der Rest an das Skript gesendet.


Ihr Skript gibt nur eine Zahl aus, da für jede Eingabezeile nach NSET_OUTPUT sucht und, falls gefunden, überspringt fünf Zeilen vor dem Abrufen der Nummer aus der zweiten Spalte.

Das Folgende ist eine feste Version von Ihrem Skript:

BEGIN { print_values = 0 } $12 ~ /NSET_OUTPUT/ { for (i = 1; i <= 5; i++) { getline; } print_values = 1; } print_values == 1 { x = $2; print x >"nset_output.dat" } 

Kommentare

  • Beachten Sie dass die Befehlsausgabe einen Header hat (siehe Fragenrevision), der Dinge wie 3G enthalten kann. Ihre Regex muss strenger sein, um solche Werte zu filtern.
  • @sjsam Not ziemlich sicher, dass ich das selbst sehe (ich schaue mir die Revisionen an), aber ich ' habe die Antwort trotzdem aktualisiert (auf eine Weise, die sie von Ihrer und unterscheidet Stephen ' s).

Antwort

Wir können testen Um zu sehen, ob das erste Feld mit einer Zahl beginnt, drucken Sie einfach das zweite

awk "$1 ~ /^[0-9][0-9]*$/ { print $2}" electric_thermal.dat > nset_output.dat 

Dies entspricht Ihrer Quelldatei und gibt

Kommentare

  • Warum nicht [0-9]+ coz first column is always a number? Außerdem stammt die Eingabe eindeutig von einem Befehl, daher sollte sie weitergeleitet werden.
  • Nicht alle Versionen von unterstützen die + Syntax. Die Frage besagte, dass Daten von electric_thermal.dat
  • Hmm ,,, ich habe den Kommentar im Skript übersehen. Vielen Dank. In Bezug auf + hatte ich nie ein Problem mit gnu/non-gnu awks Welche Version meinten Sie?
  • Alte alte Systeme 🙂

Antwort

ist dein Freund:

awk "$1 ~ /^[[:digit:]]+$/{print $2}" electric_thermal.dat >outfile 

sollte dies tun

Antwort

Befehl

 awk "$1 ~ /^[0-9]*$/{print $2}" file name output 20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 35.08 35.08 38.87 38.87 42.67 42.67 46.48 46.48 50.29 50.29 54.12 54.12 57.95 57.95 61.79 61.79 65.64 65.64 69.50 69.50 73.37 73.37 77.25 77.25 81.14 

Antwort

Wenn die obigen 7 Zeilen nach Ausführung des Befehls dauerhaft sind Verwenden Sie jedes Mal:

yourcommand | sed 1,7d | awk "{print $2}" 

sed 1,7d blendet einfach die ersten 7 Zeilen aus, die Sie nicht benötigen sortiert den genauen Inhalt, nach dem Sie tatsächlich suchen …

cat yourcommand_out | sed 1,7d | awk "{print $2}" 20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 35.08 35.08 38.87 38.87 42.67 42.67 46.48 46.48 50.29 50.29 54.12 54.12 57.95 57.95 61.79 61.79 65.64 65.64 69.50 69.50 73.37 73.37 77.25 77.25 81.14 

Kommentare

  • Downvote: Nutzlos [ Verwendung von cat ] und die Lösung erfüllt ' nicht y die Anforderungen. Formatieren Sie auch den Code.

Antwort

Versuchen Sie Folgendes:

awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile 

Kommentare

  • Bitte lernen Sie, Codeblöcke zu verwenden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.