encontre o valor inteiro após uma string de um arquivo

encontre o valor inteiro após uma string de um arquivo

Quero obter o valor inteiro após uma string específica de um arquivo e classificar todos os números inteiros. Ex - tenho um arquivo com milhares de linhas com peso de string,

-weight 100
-weight 200
-weight 20

Quero obter todos os valores inteiros em ordem de classificação.

Responder1

Se você estiver procurando pela sequência de números mais longa que é a última coisa na linha, basta usar grep:

$ grep -oP '\d+\s*$' file 
100
200
20

Diz para imprimir apenas a parte correspondente da linha e habilita expressões regulares compatíveis com Perl -o. PCREs nos permitem usar "um ou mais dígitos" e "0 ou mais caracteres de espaço em branco". Então, todos juntos, esse comando imprimirá o maior trecho de números encontrado no final da linha.grep-P\d+\s*

Se você precisar classificá-los, basta passar por sort:

$ grep -oP '\d+\s*$' file | sort -n
20
100
200

Se, em vez disso, você precisar ancorar seu padrão usando uma string específica, use:

$ grep -oP -- '-weight\s+\K\d+' file | sort -n
20
100
200

O comando \Kdiz greppara não incluir nada que corresponda até este ponto, então o comando acima imprimirá apenas o trecho mais longo de números após -weighte 0 ou mais espaços.

Observe que se quiser incluir também números negativos ou decimais, você precisará de:

grep -oP -- '-weight\s+\K[0-9,-]+' file | sort -n

Por exemplo:

$ cat file 
-weight 100
-weight 200
-weight 20
-weight -29
-weight -32.4

$ grep -oP -- '-weight\s+\K[0-9,-]+' file | sort -n
-32
-29
20
100
200

Responder2

Experimente isto:

cut -d ' ' -f2 inputfile|sort -n

-d ' '- definir o delimitador para espaço
-f2- obter a segunda coluna
sort -n- classificar o resultado como números
Resultado do teste:

20
100
200

Responder3

Experimente este comando sed:

sed -E 's/^.*weight\s([[:digit:]]*).*/\1/' sort.txt  | sort -n

Ou

sed -E 's/.*weight\s([0-9]*).*/\1/' sort.txt | sort -n

Caso de teste:

-weight 100 
-weight 200 
-weight 20

Resultados:

20
100 
200

Nota: - Você não deu um bom caso de teste, então assumi o meu.

Informações:

  • ^.*weight\s([[:digit:]]): Leia cada linha e capture os números após a palavra “peso” com o “espaço” a seguir.
  • | sort -n: canalize a saída para o comando de classificação e classifique por valor numérico.

informação relacionada