Zeilen entfernen, deren Feldwert kleiner oder gleich 3 ist - sed oder awk?

17

Ich muss jede Zeile entfernen, die im 8. Feld (Spalte) einen Wert von 2 oder weniger hat.

Meine Daten sehen so aus:

12-31   Airport 189 379 41  49.70946503 -124.91377258   2   2880    30.8
01-01   AlberniElementary   165 331 16  49.26100922 -124.80662537   4   5760    26.1
01-09   BamfieldMarine  161 323 23  48.83490372 -125.13572693   2   2875    27.4
01-10   BamfieldMarine  161 323 23  48.83490372 -125.13572693   3   3068    38.6

Ich verstehe, dass ich mit awk die gewünschten Werte entfernen und in eine andere Datei drucken kann, und ich verstehe, dass sed die aktuelle Datei bearbeiten würde. In beiden Fällen muss ich die Originaldatei behalten.

Hinweis : Bitte erläutern Sie Ihre Lösungen ausführlich. Es reicht nicht aus, nur den Befehl zu schreiben, bitte kommentieren Sie die Vorschläge.

Weiterer Hinweis : Die Daten haben eine Kopfzeile, daher wird dies höchstwahrscheinlich erforderlich sein

awk 'FNR> 1'

Schätze ich?

Geokrowding
quelle

Antworten:

19

Sie haben es fast geschafft.

 awk '(NR>1) && ($8 > 2 ) ' foo > bar

wo

  • NR ist die Nummer des Datensatzes (das ist die Nummer der Zeile)
  • $8 ist acht Feld
  • && ist logisch und
  • foo ist die Originaldatei, unverändert
  • bar resultierende Datei
  • implizite Standardaktion ist das Drucken der aktuellen Eingabezeile

Beachten Sie, dass der Header von foo nach bar gestreift ist, um ihn zu behalten

 awk '(NR==1) || ($8 > 2 ) ' foo > bar

wo

  • || ist logisch oder
  • Eingabezeile wird gedruckt, wenn NR == 1 oder $ 8> 2

Update Nr. 1

Angeben eines Bereichs

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 8. Feld von -4 bis 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) gleich, inklusive Header
Archemar
quelle
Tolle Antwort: Einfach und doch gründlich, danke. Nur damit ich klar bin, ist der Unterschied zwischen FNR und NR in diesem Fall nichts, richtig? Ich habe das gelesen Mann Seite , wo es erklärt: NR Ordnungszahl des aktuellen Datensatz & FNR Ordnungszahl des aktuellen Datensatz in der aktuellen Datei. Also ich verstehe, dass diese in diesem Fall gleich sind, denke ich :)
Geokrowding
Wenn Sie eine Datei haben, ist FNR immer NR, wenn Datei1 10 Zeilen hat, hat die erste Zeile von Datei2 NR = 11 und FNR = 1
Archemar
Hallo, ich möchte etwas ähnliches tun, aber alles in einem Bereich von -4 bis 4 akzeptieren. Wie würde ich dabei vorgehen, da dies der einzige Weg ist, den ich mir vorstellen kann, es derzeit zu tun, awk '(NR == 1) || ($ 8 = [-4-4]) 'foo> bar
Giles
1
awk kennt sich nicht mit mathematischen Stilen aus, siehe meine Bearbeitung.
Archemar