2009-03-23 3 views
0

Ich habe ein Datum, die wie folgt aussieht:AWK Passende positive und negative Zahlen

-1033 
- 
222 
100 
-30 
- 
10 

Was ich tun möchte, ist es, alle Zahlen zu erfassen ohne „Strich nur“ -Eintrag.

Warum mein awk unten fehlgeschlagen?

awk '$4 != "-" {print $4}' 
+0

Funktioniert für mich, mit GNU awk. Sind Sie sicher, dass Sie sich auf das richtige Feld beziehen? ($ 4) –

+0

dachte das gleiche. sieht verdächtig –

+0

ich denke awk '!/- /' könnte auch funktionieren. Ich lese es ist das gleiche wie awk '! ($ 0 ~ "-"), aber ich bin mir nicht ganz sicher. –

Antwort

1

Ihr awk Skript sagt

Wenn das vierte Feld nicht ein Strich ist, drucken Sie es aus

aber Sie wollen es ausdrucken, wenn die Linie nicht ein Strich ist

awk '$0 != "-"' 

Standard Aktion ist zu drucken, so dass keine Körper benötigt wird.

Wenn Sie eine Gruppe von Zahlen drucken möchten, können Sie eine GNU awk-Erweiterung verwenden, wenn Sie gawk verwenden. Es ermöglicht Splitting Aufzeichnungen mit regulären Ausdrücken:

gawk 'BEGIN { RS="(^|\n)-($|\n)" } { print "Numbers:\n" $0 }' 

Statt nun Linien, dauert es eine Gruppe von Zahlen durch eine Linie nur - enthält, getrennt. Einstellen des Feldtrenn (FS) auf eine neue Zeile können Sie die Zahlen innerhalb einer solchen Gruppe iterieren:

gawk 'BEGIN { FS="\n"; RS="(^|\n)-($|\n)" } 
     { print "Numbers:"; for(i=1;i<=NF;i++) print " *: " $i }' 

Allerdings stimme ich mit anderen Antworten. Wenn Sie nur Zeilen mit einem bestimmten Text filtern möchten, ist grep das bessere Werkzeug dafür.

1

Unter der Annahme, dass die Datendatei ist tatsächlich mehrspaltigen, und dass die Werte in Spalte 4, wird folgende Arbeiten:

awk '$4 != "-" {print $4} {}' 

Er druckt nur den Wert, bei dem es nicht „- ". Ihre Version wird wahrscheinlich den Wert unabhängig davon (oder zweimal) ausgeben, da die Standardaktion gedruckt werden soll. Hinzufügen der {} macht die Standardaktion "nichts tun".

Wenn die Daten tatsächlich wie dargestellt (nur eine Spalte), sollten Sie $1 verwenden anstatt $4 - ich $0 nicht da, dass die ganze Linie ist verwenden würden, und es scheint, Sie Leerzeichen am Ende Ihrer ersten beiden haben Linien, die dazu führen würden, $0"-1033 " und "- " zu sein.

Aber, wenn es sich um eine einzelne Säule wäre, würde ich awk nicht verwenden, sondern vielmehr:

grep -v '^-$' 
grep -v '^ *- *$' 

die zweite auf beiden Seiten des "-" Zeichen für Räume ermöglicht.

1

Warum überprüfen Sie $4? Es scheint, dass Sie $1 oder $0 überprüfen sollten, wie litb sagte.

Aber awk ist ein schweres Werkzeug für diesen Job.Versuchen

grep -v '^-$' 

Linien entfernen nur einen Bindestrich oder

grep -v '^ *- *$' 

enthält nur einen Bindestrich enthält, Linien zu entfernen und möglicherweise einige Leerzeichen.

+0

Die Datei kann tatsächlich eine mehrspaltige Datei mit den relevanten Werten in Spalte 4 sein. Das war meine Lektüre. Zum Beispiel eine Aktientransaktionsdatei, die Datum, Lager, Dollarwert und Menge in jeder Zeile enthält und nur an realen Mengen interessiert ist. (cont ...) – paxdiablo

+0

... Dinge wie die Kapitalrückgabe würden Änderungen des Kaufpreises, aber nicht der Quantität beinhalten. – paxdiablo

+0

Könnte sein, aber warum scheitert es dann? Schlägt mich. –