У мене є цей файл:
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
Відповіді:
awkawk -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
[[ $0 > 10 ]]як лексичне порівняння - і в будь-якому випадку, це не дуже допоможе для не цілих значень
З грепом вам доведеться працювати з регулярними виразами; напр
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]\+\.\?'- буквальна десяткова точка \. є необов’язковим і збігається не більше одного разу \ ?. (@ десерт спасибі за вказівку на обмеження мого RegEx.)