Subconjunto de dados com awk

1

Eu quero subconjunto de dados com o awk. Digamos que eu tenha esse arquivo chamado test:

IP MAC Bandwidth etc etc

192.1.1.1 ff:ff:ff:ff 5.421M
192.1.2.3 ff:ff:ff:f3 5.120M
192.1.2.5 ff:ff:ff:f1 5.100M

stuff I don't want to be selected

Eu quero selecionar apenas os valores da largura de banda (muito melhor se eu puder excluir o M e o fim, talvez com sed, não sei como, mas esse não é o problema principal.)

O melhor subconjunto que estou fazendo no momento é com:

awk '{print $3}' test

E a saída é esta:

Bandwidth

5.421M
5.120M
5.100M

dont

Mas eu quero que seja:

5.421
5.120
5.100

Se o "M" estiver lá, não há problema, mas essa é a ideia. Eu tenho coletado informações sobre o awk e tentando coisas, mas não cheguei à solução.

    
por aDoN 30.10.2014 / 09:24

5 respostas

3

A resposta exata requer que você especifique seu problema um pouco mais. No entanto, a sintaxe geral de uma instrução awk é:

PATTERN { ACTION }

AÇÃO só será executada para linhas que correspondem a PADRÃO. Assim, podemos usar PATTERN para subconjunto por linha e o bloco ACTION para subconjunto por coluna. Por exemplo, dada sua entrada, eu poderia usar o seguinte:

> awk '/^[0-9]/ {print $3 }' INPUTFILE
5.421M
5.120M
5.100M

o PATTERN aqui é uma expressão regular que corresponde a qualquer linha onde o primeiro caractere é um inteiro de 0 a 9. Para remover o M você pode canalizar isso para outro comando como tr ou usar o Comando gsub como em resposta de cuonglm

awk '/^[0-9]/ { gsub(/M/, "", $3); print $3 }' INPUT_FILE
    
por 30.10.2014 / 10:20
1

Você pode remover todas as coisas que não são dígito ou ponto antes da impressão:

$ awk '{gsub(/[^[:digit:].]/,"",$3);print $3}' file
5.421
5.120
5.100
    
por 30.10.2014 / 09:36
1

Se você não pretende fazer alguma operação com o texto, o uso de sed parece ser mais razoável

sed -En 's/.* (\S+)M$//p'

-E vamos evitar o uso de meta-caracteres com barra invertida ( \(, \+, etc.)

-n suprime a saída de saída ordenada por p

s/ substituto

.* primeira parte da linha para o espaço (o último espaço é ganancioso)

() "link revers" - você pode chamar o padrão dentro de colchetes por \number

\S todo simbol não espacial (tudo exceto :blank: )

+ um ou mais símbolos anteriores

M$ "M" no final da linha

/p print line onde a substituição é feita

O significado é "Substituir linha inteira por padrão entre parênteses e linhas de impressão onde tal substituição é feita apenas"

    
por 30.10.2014 / 10:38
0

Eu não encontrei uma solução com o awk, mas isso funcionou:

cat test |grep ":"| cut -f3 -d " " | sed 's/[MGB]//g'
    
por 30.10.2014 / 10:04
0

Você também pode usar a função match no awk.

awk '{match($3, /[0-9]+.[0-9]+/,arr)}{ print arr[0]}' file
    
por 30.10.2014 / 10:45

Tags