Como eu uso o corte para separar por vários espaços em branco?

14

Gostaria de obter a última coluna desta amostra:

[  3]  1.0- 2.0 sec  1.00 MBytes  8.39 Mbits/sec
[  3]  2.0- 3.0 sec   768 KBytes  6.29 Mbits/sec
[  3]  3.0- 4.0 sec   512 KBytes  4.19 Mbits/sec
[  3]  4.0- 5.0 sec   256 KBytes  2.10 Mbits/sec
...

Se eu usar

cut -d\  -f 13

Eu obtenho

Mbits/sec
6.29
4.19
2.10

porque às vezes há espaços adicionais entre eles.

    
por rubo77 18.01.2014 / 00:54

4 respostas

10

Para responder à sua pergunta, literalmente:

sed 's/   */:/g' | cut -d : -f 5

ou

awk -F '  +' '{print $5}'

Mas isso não acontecerá se o número entre parênteses atingir 10, etc. Se você estiver interessado apenas nos números, poderá remover todo o resto.

sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6
    
por 18.01.2014 / 01:02
7

Se usarmos o comando tr juntamente com a opção squeeze ( -s flag) para converter todos os vários espaços consecutivos em um único espaço e executar cut operation com espaço como delimiter pode acessar a coluna necessária carregando os números.

Consulte o código mostrado abaixo:

cat file | tr -s ' ' | cut -d ' ' -f 8

    
por 25.01.2017 / 15:17
4

Estes comandos irão imprimir a última coluna de um arquivo separado por espaços:

  • awk '{print $NF}' file

    em awk , NF é o número de campos e $NF é o último campo.

  • perl -lane 'print $F[$#F]' file

    -a divide o arquivo no espaço em branco no array @F , $#F é o número de elementos no array, então $F[$#F] é o último elemento. O -n significa ler o arquivo fornecido na linha de comando e aplicar o script passado com -e a cada linha. -l apenas adiciona um caractere de nova linha ( \n ) a cada instrução print .

  • sed 's/.* //g'

    uma expressão regular simples que combina tudo com o último espaço e o exclui, deixando apenas a última coluna.

  • rev file | cut -d' ' -f 1 | rev

    rev inverte sua saída para que o último campo seja o primeiro, cut com espaço delimitador para imprimi-lo e rev para reverter o texto de volta ao normal. Isso ganhou Não trabalhe se você tiver espaços em branco consecutivos .

Com base em sua opinião, acredito que você não queira a última coluna, mas a penúltima ou as duas últimas. Nesse caso, use-os para imprimir os 2 últimos ( 8.39 Mbits/sec ):

awk '{print $(NF-1),$NF}' file 
perl -lane 'print "$F[$#F-1] $F[$#F]"' file 
sed 's/.* \(.* .*\)//' file 
rev file | cut -d' ' -f 1,2 | rev

e estes para imprimir o penúltimo ( 8.39 ):

awk '{print $(NF-1)}' file 
perl -lane 'print $F[$#F-1]' file 
sed 's/.* \(.*\) .*//' file 
rev file | cut -d' ' -f 2 | rev
    
por 18.01.2014 / 15:56
3

Você não pode separar a ocorrência múltipla de espaços em branco usando cut conforme o manual:

Output fields are separated by a single occurrence of the field delimiter character.

a menos que o texto seja separado pelo mesmo valor ou você use tr para remover o excesso deles.

Caso contrário, use ferramentas alternativas, como awk , sed ou ex .

Por exemplo:

ex -s +'%norm $2Bd0' +%p +q! foo.txt

Substitua +q! por -cwq para salvar as alterações no local.

    
por 12.08.2015 / 00:10