Wie extrahiere ich nur Werte, die größer als ein Schwellenwert sind, aus einer Datei?


10

Ich habe diese Datei:

names average
john:15.02
Mark:09.63
James:12.58

Ich möchte nur die Durchschnittswerte größer als 10 daraus extrahieren, daher sollte die Ausgabe in diesem Beispiel wie folgt lauten:

15.02
12.58

Antworten:


18

Mit awk

awk -F: '{if($2>10)print$2}' <filename

Erklärungen

  • -F:- setzt den FFeldtrenner auf:
  • {if($2>10)print$2}- für jede Zeile, Test , ob das 2nd - Feld ist >10, wenn so printes
  • <filename- Lassen Sie die Shell die Datei öffnen filename, das ist besser als das zu awktun, siehe Stéphane Chazelas 'Antwort zu diesem Thema

Beispiellauf

$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58

Es ist auch möglich, Leerzeichen hinzuzufügen und das Muster außerhalb der Klammern zu platzieren, damit diese gleich sind - danke an Stefan für den Hinweis:

awk -F: '{if($2>10)print$2}' <filename
awk -F: '{ if ( $2 > 10 ) print $2 }' <filename
awk -F: '$2>10{print$2}' <filename
awk -F: '$2 > 10 { print $2 }' <filename

Vielen Dank für Ihre Hilfe, perfekte Lösung. Kann ich in dieser Situation nur die Befehle 'cut' und 'grep' (grundlegende Befehle) verwenden, um aus Dateien nur Durchschnittswerte anzuzeigen, die über 10 liegen.
Haikel Fazzani

Ich verstehe deine Lösung, perfekt, vielen Dank für die Hilfe, ich schätze all deine Bemühungen.
Haikel Fazzani

Vergessen Sie nicht, dass Bash [[ $0 > 10 ]]als lexikalischer Vergleich behandelt wird - und auf jeden Fall keine große Hilfe für nicht ganzzahlige Werte ist
steeldriver

@dessert: Ich persönlich bevorzuge es, das Muster vor die Aktionsanweisungen zu setzen, z. B.: awk -F: '$ 2> 10 {print $ 2}', da es für mich aufgeräumter und einfacher zu erweitern aussieht (z. B. $ 2> 10 && $ 2 <100). .
Stefan

3

Mit grep müssten Sie mit regulären Ausdrücken arbeiten. z.B

grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2

wie bei sed:

sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file

Die Verwendung von RegEx für bestellte Daten ist jedoch (meiner Erfahrung nach) fehleranfällig und schwer zu lesen ;-).


Sehr schlau! Kann auf grep ':[1-9][0-9]\+\.' <file | cut -d: -f2und gekürzt werden sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. Es ist erwähnenswert, dass dies nur mit> 1,> 10,> 100 usw. funktioniert, zB> 20 wäre unmöglich.
Dessert

Ich habe einen Fehler in meinem RegEx gefunden: Für Zahlen ohne Dezimalpunkt muss der RegEx sein: ':[1-9][0-9]\+\.\?'- der wörtliche Dezimalpunkt \. ist optional und höchstens einmal abgeglichen \?. (@ Dessert danke für den Hinweis auf die Einschränkung meiner RegEx.)
Stefan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.