저는 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 파일에 있습니다. 숫자가 무엇인지, 이 주제가 무엇을 뱉어낼지 미리 알 수 있는 방법이 없습니다.
두 번째 질문은 스트리밍 중에 해당 숫자를 모두 내보내도록 하는 방법이 있습니까? 아니면 몇 초 동안 스트리밍한 다음 나중에 나오는 모든 숫자를 가져오기 위해 명령을 실행해야 합니까?
답변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
명령을 사용하여 줄에서 문자열 교체를 수행합니다.정규식전체 라인을 설명합니다.
패턴은 첫 번째 문자와 두 번째 /
문자 사이에 있습니다. 우리는 .*
나머지 라인과 일치시키기 위해 바깥쪽에 있습니다(우리는 그것을 버릴 것이지만 어딘가에서 알아내야 합니다).
우리는 [
그것을 우리가 관심을 갖는 가장자리와 그 안의 두 숫자로 ]
일치시킬 것입니다. 정규식 구문은 []
의미를 표현하는 데에도 사용되므로 원하는 리터럴 의미 앞에 백슬래시를 추가합니다. 이것들은 s에 있습니다 .*
.
그 사이에 \( \)
거기에 일치하는 텍스트를 캡처합니다. 이 경우 텍스트는 [^ ]*
공백을 제외한 많은 문자를 의미하는 표현식으로 설명됩니다 . 그런 다음 데이터의 리터럴 공백을 일치시키고 다른 캡처 그룹을 일치시킵니다. 두 번째 일치 항목은 를 [^]]*
제외한 많은 문자를 의미합니다 ]
. 마지막으로 ]
종결자를 일치시킵니다 \]
.
두 번째와 세 번째 사이의 부분은 /
대체 문자열이며 캡처된 두 그룹을 및로 참조할 수 있습니다 \1
. \2
예를 들어 첫 번째 줄의 \1
goes 0.1
및 \2
goes입니다. 1
다른 문자는 문자 그대로 출력에 포함되므로 문자 사이에 구분 쉼표가 나타납니다.
답변2
노력하다
df -h | sed 's/[ \t]/,/g'
또는
df -h | sed 's/[ \t]/,/g'