У меня есть этот файл:
names average
john:15.02
Mark:09.63
James:12.58
Я хочу извлечь из него только средние значения, превышающие 10, поэтому вывод в этом примере должен быть:
15.02
12.58
У меня есть этот файл:
names average
john:15.02
Mark:09.63
James:12.58
Я хочу извлечь из него только средние значения, превышающие 10, поэтому вывод в этом примере должен быть:
15.02
12.58
Ответы:
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
[[ $0 > 10 ]]
как лексическое сравнение - и в любом случае не очень поможет для нецелочисленных значений
С 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 будет невозможно.
':[1-9][0-9]\+\.\?'
- буквальная десятичная точка \. является необязательным и сопоставляется не более одного раза \ ?. (@dessert спасибо за указание на ограничение моего RegEx.)