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


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поле я є >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

я розумію рішення ур, ідеально, дякую тобі за допомогу, я ціную всі ваші зусилля ..
Хайкель Фаццані

Не забувайте, що bash трактуватиметься [[ $0 > 10 ]]як лексичне порівняння - і в будь-якому випадку, це не дуже допоможе для не цілих значень
steeldriver

@dessert: Особисто я віддаю перевагу викладенню шаблону перед заявами про дії, наприклад: awk -F: '$ 2> 10 {print $ 2}', оскільки мені це виглядає охайніше і простіше (наприклад, $ 2> 10 && 2 $ <100) .
Стефан

3

З грепом вам доведеться працювати з регулярними виразами; напр

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]\+\.\?'- буквальна десяткова точка \. є необов’язковим і збігається не більше одного разу \ ?. (@ десерт спасибі за вказівку на обмеження мого RegEx.)
Стефан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.