Как извлечь из файла только значения, превышающие пороговое значение?

10

У меня есть этот файл:

names average
john:15.02
Mark:09.63
James:12.58

Я хочу извлечь из него только средние значения, превышающие 10, поэтому вывод в этом примере должен быть:

15.02
12.58
Хайкель Фаззани
источник

Ответы:

19

С awk

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

Пояснения

  • -F:- устанавливает Fразделитель ield в:
  • {if($2>10)print$2}- для каждой строки проверьте, есть ли 2поле nd >10, если printэто так
  • <filename- пусть оболочка откроет файл filename, это лучше, чем позволить awkэто сделать, см. Ответ Стефана Шазеласа на тему

Пример запуска

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

Также возможно добавить пробелы и поставить шаблон за скобки, чтобы они были равны - спасибо Стефану за указание на это:

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
Десерт
источник
Огромное спасибо за вашу помощь, отличное решение, могу ли я использовать в этой ситуации только команды «cut» и «grep» (основные команды) для отображения из файла только средних значений, превосходящих 10 ..
Haikel Fazzani
я понимаю ваше решение, идеально, большое спасибо за помощь, я ценю все ваши усилия ..
Haikel Fazzani
Не забывайте, что bash будет восприниматься [[ $0 > 10 ]]как лексическое сравнение - и в любом случае не очень поможет для нецелочисленных значений
steeldriver
@dessert: Лично я предпочитаю ставить шаблон перед операторами действия, например: awk -F: '$ 2> 10 {print $ 2}', так как он выглядит для меня более аккуратно и его легче расширять (например, $ 2> 10 && $ 2 <100) ,
Стефан
3

С grep вам придется работать с регулярными выражениями; например

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

как с sed:

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

Но использование RegEx для упорядоченных данных подвержено ошибкам (по моему опыту) и их трудно читать ;-).

Стефан
источник
Очень умный! Можно сократить до grep ':[1-9][0-9]\+\.' <file | cut -d: -f2и sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. Стоит отметить, что это работает только с> 1,> 10,> 100 и т. Д., Например,> 20 будет невозможно.
десерт
Я нашел ошибку в моем RegEx: для чисел без десятичной точки RegEx должен быть: ':[1-9][0-9]\+\.\?'- буквальная десятичная точка \. является необязательным и сопоставляется не более одного раза \ ?. (@dessert спасибо за указание на ограничение моего RegEx.)
Стефан