Come estrarre solo valori superiori a una soglia da un file?


10

Ho questo file:

names average
john:15.02
Mark:09.63
James:12.58

Voglio estrarre solo le medie maggiori di 10, quindi l'output in questo esempio dovrebbe essere:

15.02
12.58

Risposte:


18

Con awk

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

spiegazioni

  • -F:- imposta il Fseparatore di ield:
  • {if($2>10)print$2}- per ogni riga, verifica se il 2campo nd è >10, in tal printcaso
  • <filename- lascia che la shell apra il file filename, è meglio che lasciarlo awkfare, vedi la risposta di Stéphane Chazelas sull'argomento

Esempio di esecuzione

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

È anche possibile aggiungere spazi e mettere il motivo fuori dalle parentesi, quindi questi sono uguali - grazie a Stefan per averlo sottolineato:

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

grazie mille per il tuo aiuto, soluzione perfetta, posso usare solo i comandi 'cut' e 'grep' (comandi di base) in questa situazione per visualizzare dal file solo medie superiori a 10 ..
Haikel Fazzani,

capisco la tua soluzione, perfetto, grazie mille per l'aiuto, apprezzo tutti i tuoi sforzi ..
Haikel Fazzani,

Non dimenticare che bash tratterà [[ $0 > 10 ]]come un confronto lessicale - e in ogni caso, non è di grande aiuto per valori non interi
steeldriver,

@dessert: Personalmente preferisco mettere lo schema prima delle dichiarazioni di azione, ad esempio: awk -F: '$ 2> 10 {print $ 2}', poiché mi sembra più ordinato e più facile da estendere (ad esempio $ 2> 10 && $ 2 <100) .
Stefan,

3

Con grep dovresti lavorare con espressioni regolari; per esempio

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

come con sed:

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

Ma usare RegEx sui dati ordinati è soggetto a errori (nella mia esperienza) e difficile da leggere ;-).


Molto intelligente! Può essere abbreviato in grep ':[1-9][0-9]\+\.' <file | cut -d: -f2e sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. Vale la pena ricordare che funziona solo con> 1,> 10,> 100 ecc., Ad es.> 20 sarebbe impossibile.
dessert,

Ho trovato un bug nel mio RegEx: per i numeri senza virgola il RegEx deve essere: ':[1-9][0-9]\+\.\?'- il punto decimale letterale \. è facoltativo e abbinato al massimo una volta \ ?. (@dessert grazie per aver sottolineato la limitazione del mio RegEx.)
Stefan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.