私はLinuxを使用する完全初心者であり、コマンドラインから多くのデータをcsvまたはスプレッドシートファイルにエクスポートする方法を知りたいです(テキストも可能です)。今はただecho
データをたくさん出力するテーマとして使っています。これにより、経時的なデータフローを表示できます。私がやりたいことは、数字で部品を分割してデータファイルにエクスポートすることです。
たとえば、コマンドが次のように繰り返しストリーミングされる場合:
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: []
待って、時間が経つにつれて、私は次のことをしたいと思います。
- 場所を表す数字と
- 秒とナノ秒を表す数字、
すべてcsvファイルにあります。数字が何であるか、このトピックが何を吐き出すかを事前に知る方法はありません。
2番目の質問は、ストリーミング中にその数字をすべてエクスポートする方法はありますか?それとも、数秒間ストリーミングしてから、後のすべての数字を取得するためにコマンドを実行する必要がありますか?
ベストアンサー1
まったく異なる形式のデータを含むように質問が編集されました。元の答えはその行の下にあり、sed
通常関連する部分はまだ適用されます。
sed
行を別の形式に書き換えることができます。以下は、sed
この新しいデータの各レコードにCSV行を提供するクイックコマンドです。
sed -n -e '/secs:/{s/.*secs://;H;};/position:/{s/^.*position: \[\([^]]*\)\]/\1/;G;s/\n\+/,/gp}'
これは以下を使用します。スペアスペース。一方、あなたが本当に欲しいものYAMLパーサー他のツールを使ってこれを行うことができるからといって、sed
そうする必要があるという意味ではありません。
同時に交換してgrepするには、次のものをsed
使用できます。-n
そしてp
:
sed -n -e 's/foo/bar/p'
データを読み取る場合は、ストリーミングされる限り使用できます。シェルパイプラインこれを行うには:
yourcommand | sed -e '...'
yourcommand
これにより、直接出力がsed
の入力に入り、上記のようにベクトルフィールドを処理できます。yourcommand
パイプラインが完了すると、パイプラインが完成します。
sed
出力をファイルにリダイレクトするには、次のようにします。出力リダイレクト:
yourcommand | sed -e '...' > vectors.csv
vectors.csv
これにより、コマンドの出力を含むCSVファイルが生成されますsed
。
data
(生)形式のファイルが与えられた場合:
time position t x: [0.1 1]
time position t x: [0.2 2]
time position t x: [0.3 3]
以下を実行できます。
sed -e 's/.*\[\([^]]*\)\].*/\1/' data
次の形式の出力を取得します。
0.1 1
0.2 2
0.3 3
カンマで区切る必要があるため、これもできます。
sed -e 's/.*\[\([^ ]*\) \([^]]*\)\].*/\1,\2/' < data
0.1,1
0.2,2
0.3,3
sed
行を書き換えるためのプログラミング言語を提供します。そのs
コマンドを使用して行で文字列置換を実行します。正規表現全体の行を説明します。
パターンは、最初の文字と2番目の文字/
の間にあります。私たちは.*
残りの行と一致させるために外側にいます(私たちはそれを捨てますが、どこかで調べる必要があります)。
我々は[
それを我々が興味を持っているエッジとその中の2つの数字に]
一致させます。正規表現構文は[]
意味を表現するためにも使用されるので、目的のリテラル意味の前にバックスラッシュを追加します。これらはsにあります.*
。
その間に\( \)
そこに一致するテキストをキャプチャします。この場合、テキストは[^ ]*
スペースを除く多くの文字を意味する式で記述されます。次に、データのリテラルスペースを一致させ、他のキャプチャグループを一致させます。 2番目の一致は、を[^]]*
除く多くの文字を意味します]
。最後に、]
ターミネータを一致させます\]
。
2番目と3番目の間の部分は/
代替文字列であり、キャプチャされた2つのグループを参照することができます\1
。\2
たとえば、最初の行の\1
goes0.1
と\2
goesです。1
他の文字は文字通り出力に含まれるため、文字間に区切りコンマが表示されます。