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]+
cozfirst 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 vonelectric_thermal.dat
- Hmm ,,, ich habe den Kommentar im Skript übersehen. Vielen Dank. In Bezug auf
+
hatte ich nie ein Problem mitgnu/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.