Como exportar dados no terminal para um arquivo (por exemplo, arquivo csv)

5

Sou um completo iniciante no uso do Linux e gostaria de saber como exportar um monte de dados na linha de comando para um arquivo csv ou de planilha (ou até mesmo o texto funcionaria). No momento, estou usando apenas echo em um tópico que imprime uma tonelada de dados. Assim, posso ver os dados à medida que são transmitidos ao longo do tempo. O que eu quero fazer é separar apenas as partes com números e exportá-las para um arquivo de dados.

Então, por exemplo, se o comando estiver transmitindo repetidamente algo como:

header: 
  seq: 93342 
  stamp: 
    secs: 1406820172 
    nsecs: 191358647 
  frame_id: '' 
name: ['arm_joint_1', 'arm_joint_2', 'arm_joint_3', 'arm_joint_4', 'arm_joint_5', 'gripper_finger_joint_l', 'gripper_finger_joint_r'] 
position: [2.116426527797216, 1.8058519002096407, -1.6111500844302575, 3.479512978878036, 2.8513271915116376, 0.0, 0.0] 
velocity: [-0.0, -0.0, 0.0, -0.0, -0.0, 0.0, 0.0] 
effort: [] 
--- 
header: 
  seq: 93343 
  stamp: 
    secs: 1406820172 
    nsecs: 211357280 
  frame_id: '' 
name: ['arm_joint_1', 'arm_joint_2', 'arm_joint_3', 'arm_joint_4', 'arm_joint_5', 'gripper_finger_joint_l', 'gripper_finger_joint_r'] 
position: [2.116426527797216, 1.8058519002096407, -1.6111500844302575, 3.479512978878036, 2.8513271915116376, 0.0, 0.0] 
velocity: [-0.0, -0.0, 0.0, -0.0, -0.0, 0.0, 0.0] 
effort: []

etc, à medida que o tempo passa, quero apenas o seguinte:

  1. Os números que representam a posição e
  2. Os números que representam Segs e Nsecs,

tudo em um arquivo csv. Os números são o que eles são e eu não tenho como saber o que este tópico vai cuspir antecipadamente.

Uma questão secundária é, existe uma maneira de exportar simplesmente todos esses números enquanto estiver fluindo, ou eu tenho que transmitir por alguns segundos, e então executar um comando para pegar todos os números. que cuspa depois do fato?

    
por AAC 30.07.2014 / 23:57

2 respostas

2

A questão foi editada para incluir dados em um formato totalmente diferente. A resposta original está abaixo da linha, e as partes relativas a sed em geral ainda se aplicam.

sed pode reescrever linhas em outros formatos . Aqui está um rápido comando sed para fornecer uma linha CSV por registro para esses novos dados:

sed -n -e '/secs:/{s/.*secs://;H;};/position:/{s/^.*position: \[\([^]]*\)\]//;G;s/\n\+/,/gp}'

Isso usa o espaço reservado . Por outro lado, o que você realmente quer aqui é um YAML parser ; só porque podemos fazer isso com sed ou outras ferramentas, não significa que devemos fazê-lo.

Para fazer uma substituição e um grep ao mesmo tempo com sed , você pode usar -n e p :

sed -n -e 's/foo/bar/p'

Quanto à leitura de dados, desde que seja streaming, você pode usar os pipelines de shell para fazer isso:

yourcommand | sed -e '...'

Isso coloca a saída de yourcommand diretamente na entrada de sed , onde ele pode processar os campos de vetor para você como acima. Quando yourcommand termina, o pipeline também.

Para redirecionar a saída sed para um arquivo, também é possível usar o redirecionamento de saída :

yourcommand | sed -e '...' > vectors.csv

Isso criará um arquivo CSV chamado vectors.csv com a saída do comando sed .

Dado um arquivo data em seu formato (original):

time position t x: [0.1 1]
time position t x: [0.2 2]
time position t x: [0.3 3]

você pode executar:

sed -e 's/.*\[\([^]]*\)\].*//' data

e obtenha a saída do formulário:

0.1 1
0.2 2
0.3 3

Você pode querer isso separado por vírgula, para que possamos fazer isso também:

sed -e 's/.*\[\([^ ]*\) \([^]]*\)\].*/,/' < data

0.1,1
0.2,2
0.3,3

sed fornece uma linguagem de programação para reescrever linhas, e estamos usando o comando s para fazer uma substituição de string no expressão regular que descreve toda a linha.

O padrão é entre o primeiro e o segundo / caracteres. Temos .* do lado de fora, para combinar com o resto da linha (que vamos jogar fora, mas precisamos nos endereçar em algum lugar).

Combinamos [ e ] como as bordas daquilo que nos interessam e os dois números dentro delas. Como a sintaxe da expressão regular também usa [] para significar algo, colocamos barras invertidas antes das que queremos literalmente. Essas estão dentro do .* s.

Entre \( \) , estamos capturando o texto que combinamos lá. Nesse caso, o texto é descrito pela expressão [^ ]* , que significa muitos caracteres, exceto um espaço. Então, combinamos um espaço literal com seus dados, seguido por outro grupo de captura. O segundo grupo corresponde a [^]]* , o que significa muitos caracteres, exceto ] . Finalmente, combinamos a terminação ] com \] .

A parte entre o segundo e o terceiro / é a sequência de substituição e podemos nos referir aos nossos dois grupos capturados como e : torna-se 0.1 e torna-se 1 para a primeira linha, por exemplo. Quaisquer outros caracteres são incluídos literalmente na saída, então a vírgula de separação aparece entre eles.

por 31.07.2014 / 00:13
0

Tente

df -h | sed 's/[ \t]/,/g'

ou

df -h | sed 's/[ \t]/,/g'

    
por 21.10.2016 / 14:45