Eu tenho este arquivo:
names average
john:15.02
Mark:09.63
James:12.58
Eu quero extrair apenas as médias maiores que 10, portanto a saída neste exemplo deve ser:
15.02
12.58
Eu tenho este arquivo:
names average
john:15.02
Mark:09.63
James:12.58
Eu quero extrair apenas as médias maiores que 10, portanto a saída neste exemplo deve ser:
15.02
12.58
Respostas:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
- define o F
separador de campo para:
{if($2>10)print$2}
- para cada linha, teste se o 2
campo nd é >10
, se sim print
,<filename
- deixe o shell abrir o arquivo filename
, é melhor do que deixar awk
fazer isso, veja a resposta de Stéphane Chazelas sobre o tópico$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58
Também é possível adicionar espaços e colocar o padrão fora dos colchetes, para que sejam iguais - obrigado a Stefan por apontar isso:
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 ]]
como uma comparação lexical - e, em qualquer caso, não é de muita ajuda para valores não-inteiros
Com o grep, você teria que trabalhar com expressões regulares; por exemplo
grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2
como com sed:
sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file
Mas o uso do RegEx em dados ordenados é propenso a erros (na minha experiência) e difícil de ler ;-).
grep ':[1-9][0-9]\+\.' <file | cut -d: -f2
e sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file
. Vale ressaltar que isso funciona com> 1,> 10,> 100 etc. apenas, por exemplo,> 20 seria impossível.
':[1-9][0-9]\+\.\?'
- o ponto decimal literal \. é opcional e corresponde no máximo uma vez \ ?. (@dessert Obrigado por apontar a restrição da minha RegEx.)