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:
awkawk -F: '{if($2>10)print$2}' <filename
-F:- define o Fseparador de campo para:{if($2>10)print$2}- para cada linha, teste se o 2campo nd é >10, se sim print,<filename- deixe o shell abrir o arquivo filename, é melhor do que deixar awkfazer 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: -f2e 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.)