У мене є цей файл:
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
поле я є >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.)