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
Haikel Fazzani
quelle

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
Dessert
quelle
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 ;-).

Stefan
quelle
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