2010-01-03 2 views
5

날짜 및 값이있는 텍스트 파일 (정확하게는 “ 독일어 형식 ​​“ CSV 파일, 즉 세미콜론으로 구분 된 10 진수 쉼표)이 있습니다. 각 라인의 측정 값.
추가 작업 전에 제거 할 오류 값이 있습니다. 나는 이러한 교정 내용을 일부 스크립트에 저장하여 교정 내용을 문서화하고 필요한 경우 교정 내용을 재생할 수 있도록하고 싶습니다. 파일에서 주어진 패턴 사이에있는 줄을 제거하십시오 (Unix 도구 사용)

의 선

는 다음과 같이 :

28.01.2005 14:48:38;5,166 
28.01.2005 14:50:38;2,916 
28.01.2005 14:52:38;0,000 
28.01.2005 14:54:38;0,000 
(long stretch of values that should be removed; could also be something else beside 0) 
01.02.2005 00:11:43;0,000 
01.02.2005 00:13:43;1,333 
01.02.2005 00:15:43;3,250 

가 지금은 28.01.2005 14:52:38 + 01.02.2005 00:11:43 등의 시작과 끝 패턴 목록을 저장하고 싶습니다하고 스크립트가 이러한/끝 쌍을 시작 일치하는 라인을 잘라 것이며, 그들 사이에있는 모든 것.

awk 스크립트 해킹을 생각하고 있지만 이미 기존 도구가 누락되었습니다.

sed '/start_pat/,/end_pat/d' 

하는 행을 삭제합니다 : -

답변

16

sed에서보세요 끝에 0000없이 라인을 원한다고 생각 start_patend_pat (포함) 사이.

여러 같은 쌍을 삭제하려면 여러 -e 옵션을 결합 할 수 있습니다 :

sed -e '/s1/,/e1/d' -e '/s2/,/e2/d' -e '/s3/,/e3/d' ... 
+0

좋아요! 나는 내가 뭔가를 놓치고 있다는 것을 알았다. & hellip; 나는 항상 sed를 단일 패턴으로 사용했으며 범위를 제공한다는 것을 결코 회상하지 않았습니다. –

+0

또한, 표현식을 파일에 넣을 수 있습니다. 여기서 주석 ('#')을 사용할 수도 있습니다. 명령 행은'sed -f scriptfile outfile'입니다. –

-1

사용 그렙 -L (인쇄 없음 일치하는 라인)

죄송합니다 방금

+0

grep -L은 일치하지 않는 파일 이름을 인쇄합니다. grep -v는 일치하지 않는 줄을 인쇄하지만 OP는 범위가 더 복잡한 뭔가가있는 것 같습니다. – mopoke

+0

좋아, 나는 그들이 단지 0.000없이 끝내고 인쇄하기를 원한다고 생각했다 –

+0

실제로, 나의 예는 약간 오도 된 것이다. – 0 이외에 다른 결함 값이있다. 부정적인 것. –

0

을 첫째로, 당신은 왜 당신이 한 일에 대한 기록을 보관해야합니까? 원본 파일의 백업을 유지하거나 이전 & 개의 새 파일을 비교하거나 소스 제어에 넣는 것이 어떻습니까?

실제 변경 사항은 Vim을 사용하는 것이 좋습니다.

Vim :global 명령 (축약 된 :g)을 사용하여 다음을 실행할 수 있습니다. 정규식과 일치하는 행에 ex 명령 사용. 이것은 명령어가 일치하는 라인을 기준으로 범위를 참조 할 수 있기 때문에 awk보다 더 강력합니다. 또한 Vim의 전체 텍스트 처리 능력을 마음껏 사용할 수 있습니다. 이 날짜로 시작하지 않는 선합니다 (! 경기를 부정), 추가 일치

:g!/^\d\d\.\d\d\.\d\d\d\d/ -1 write tmp.txt >> | delete 

:

예를 들어, 이것은 당신이 (테스트되지 않은, 그래서주의의 위험 부담) 원하는 가까이 뭔가를 할 것입니다 tmp.txt 파일의 이전 행을 삭제 한 다음 현재 행을 삭제합니다.

아마도 tmp.txt에 중복 행이 생기 겠지만, uniq을 통해 파일을 실행하여 제거 할 수 있습니다.

+0

내가 던진 기록과 이유에 대해 짧은 메모를하고 싶습니다. 나는이 데이터를 자주 사용하지 않을 것이며, 내가 한 일을 잊어 버릴 수도 있다는 것을 안다. 다른 사람이 내가 한 일을 이해하고 재현해야 할 수도 있습니다. 슬프게도, 모든 라인이 날짜로 시작하기 때문에 vi/ex 예제는 실제로 내 문제를 해결하지 못합니다. 그러나 나는 당신이 가리키는 방향을 이해합니다. –

0

당신은 또한 내가 심각하게 펄의 기초 (즉,하지 OO 물건을) 학습 제안 AWK

awk '/start/,/end/' file 
+1

데이터가 열 형식으로 표시되는 경우 awk가 적절하다고 언급 한 부분이 있습니다. 그 맞습니까. awk가 **이 ** 특정 작업을 위해 sed보다 나은지 설명해주십시오. –

0

를 사용하고 있습니다. 그것은 양동이 -로드에 당신을 갚을 것이다.

일단 awk, sed, grep 등을 사용하는 데 익숙하다면 기본 지식을 이해하고 나면이 작업 (및 기타 많은 작업)을 수행하는 데 빠르고 간단하게 작성할 수 있습니다.

많은 도구를 사용하는 방법과 문제를 해결하기 위해 여러 도구를 함께 사용했던 곳을 기억하지 않아도됩니다. 하나의 펄 스크립트 만 사용하면됩니다.

그리고 perl은 이제 거의 모든 유닉스/리눅스 배포판에 설치됩니다.

(그 말은 깔끔하지만 :-)

관련 문제