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
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:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
- setzt den F
Feldtrenner auf:
{if($2>10)print$2}
- für jede Zeile, Test , ob das 2
nd - Feld ist >10
, wenn so print
es<filename
- Lassen Sie die Shell die Datei öffnen filename
, das ist besser als das zu awk
tun, siehe Stéphane Chazelas 'Antwort zu diesem Thema$ <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
[[ $0 > 10 ]]
als lexikalischer Vergleich behandelt wird - und auf jeden Fall keine große Hilfe für nicht ganzzahlige Werte ist
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 ;-).
grep ':[1-9][0-9]\+\.' <file | cut -d: -f2
und 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.
':[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.)