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

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

names average john:15.02 Mark:09.63 James:12.58

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

15.02 12.58
7
задан 19 December 2017 в 04:56

6 ответов

С awk

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

Пояснения

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

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

$ 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
9
ответ дан 22 May 2018 в 16:55
  • 1
    Большое вам спасибо за вашу помощь, отличное решение, могу ли я использовать команды «cut» и «grep» (базовые команды) в этой ситуации, чтобы отображать из файла только средние значения, превышающие 10. – Haikel Fazzani 18 December 2017 в 23:19
  • 2
    Я понимаю решение ура, отлично, большое спасибо за помощь, я ценю все ваши усилия. – Haikel Fazzani 18 December 2017 в 23:54
  • 3
    Не забывайте, что bash будет рассматривать [[ $0 > 10 ]] как лексическое сравнение - и в любом случае не очень помогает для нецелых значений – steeldriver 19 December 2017 в 00:24
  • 4
    @dessert: Я лично предпочитаю ставить шаблон перед операциями действий, например .: awk -F: '$ 2 & gt; 10 {print $ 2} ', поскольку он выглядит более аккуратным для меня и более простым для расширения (например, $ 2 & gt; 10 & amp; & amp; $ 2 & lt; 100). – Stefan 19 December 2017 в 23:59

С awk

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

Пояснения

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

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

$ 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
9
ответ дан 18 July 2018 в 00:54

С awk

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

Пояснения

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

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

$ 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
9
ответ дан 24 July 2018 в 17:18

С 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 по упорядоченным данным подвержено ошибкам (по моему опыту) и трудно читается; -). [!d2 ]

3
ответ дан 22 May 2018 в 16:55
  • 1
    Очень умно! Может быть сокращено до grep ':[1-9][0-9]\+\.' <file | cut -d: -f2 и sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. Следует отметить, что это работает только с & gt; 1, & gt; 10, & gt; 100 и т. Д. & gt; 20 было бы невозможно. – dessert 19 December 2017 в 11:36
  • 2
    Я нашел ошибку в моем RegEx: для чисел без десятичной точки RegEx должен быть: ':[1-9][0-9]\+\.\?' - буквальная десятичная точка \. является необязательным и не более чем соответствует \ ?. (@dessert спасибо за указание ограничения моего RegEx.) – Stefan 20 December 2017 в 00:28

С 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 по упорядоченным данным подвержено ошибкам (по моему опыту) и трудно читается; -).

3
ответ дан 18 July 2018 в 00:54

С 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 по упорядоченным данным подвержено ошибкам (по моему опыту) и трудно читается; -).

3
ответ дан 24 July 2018 в 17:18
  • 1
    Очень умно! Может быть сокращено до grep ':[1-9][0-9]\+\.' <file | cut -d: -f2 и sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. Следует отметить, что это работает только с & gt; 1, & gt; 10, & gt; 100 и т. Д. & gt; 20 было бы невозможно. – dessert 19 December 2017 в 11:36
  • 2
    Я нашел ошибку в моем RegEx: для чисел без десятичной точки RegEx должен быть: ':[1-9][0-9]\+\.\?' - буквальная десятичная точка \. является необязательным и не более чем соответствует \ ?. (@dessert спасибо за указание ограничения моего RegEx.) – Stefan 20 December 2017 в 00:28

Другие вопросы по тегам:

Похожие вопросы: