Como extrair apenas valores maiores que um limite de um arquivo?

10

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
Haikel Fazzani
fonte

Respostas:

18

Com awk

awk -F: '{if($2>10)print$2}' <filename

Explicações

  • -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

Exemplo de execução

$ <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
sobremesa
fonte
muito obrigado por sua ajuda, solução perfeita, posso usar apenas os comandos 'cut' e 'grep' (comandos básicos) nesta situação para exibir a partir do arquivo apenas médias superiores a 10 ..
Haikel Fazzani
eu entendo ur solução, perfeito, muito obrigado por ajuda, eu aprecio todos os esforços teus ..
Haikel Fazzani
Não se esqueça que o bash irá tratar [[ $0 > 10 ]]como uma comparação lexical - e, em qualquer caso, não é de muita ajuda para valores não-inteiros
steeldriver
@dessert: Pessoalmente, prefiro colocar o padrão antes das declarações de ação, por exemplo: awk -F: '$ 2> 10 {print $ 2}', pois parece mais arrumado e mais fácil de estender (por exemplo, $ 2> 10 && $ 2 <100) .
Stefan
3

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 ;-).

Stefan
fonte
Muito esperto! Pode ser reduzido para 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.
dessert
Eu encontrei um bug no meu RegEx: para números sem ponto decimal, o RegEx deve ser: ':[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.)
Stefan