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
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:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
- imposta il F
separatore di ield:
{if($2>10)print$2}
- per ogni riga, verifica se il 2
campo nd è >10
, in tal print
caso<filename
- lascia che la shell apra il file filename
, è meglio che lasciarlo awk
fare, vedi la risposta di Stéphane Chazelas sull'argomento$ <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
[[ $0 > 10 ]]
come un confronto lessicale - e in ogni caso, non è di grande aiuto per valori non interi
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 ;-).
grep ':[1-9][0-9]\+\.' <file | cut -d: -f2
e 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.
':[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.)