특정 줄 제거

특정 줄 제거

CSV 파일에서 몇 줄을 제거하고 싶습니다.

규칙은 매우 간단합니다(경우 줄을 유지하세요).

  • 파일의 첫 번째 줄입니다.
  • 첫 번째 값은 이전 행의 첫 번째 값과 다릅니다.
  • 두 번째 값은 이전에 유지된 줄보다 최소 10만큼 증가했습니다.

원천

Test1,  0.0, 1
Test1,  0.2, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2,  0.3, 3
Test2,  1.0, 5
Test2, 11.0, 7

결과

Test1,  0.0, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2, 11.0, 7

awk와 몇 가지 if 문을 사용하여 이 작업을 수행하려고 생각했지만 레코드 처리 간에 전송되는 변수를 만들 수 있는지 확실하지 않습니다.


편집: 이 내용은 댓글 섹션에 숨겨져 있었습니다(나의 경우).

방금 레코드 간에 변수를 사용할 수 있다는 것을 알았습니다. C처럼 작동하지 않는 것입니다. 누군가가 다른 사람에게 유용하다고 생각되는 답변을 제공하거나 누군가 나에게 답변을 요청하지 않는 한 이 질문을 제거하겠습니다.

답변1

awk 태그가 붙어 있기 때문에

awk -F", *" 'x!=$1||$2>=y+10{y=$2;print}{x=$1}' file


Test1,  0.0, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2, 11.0, 7

답변2

펄 사용:

perl -lane 'if($.==1||"$F[0]"ne"$F0"||$F[1]>=$F1+10){print;$F1=@F[1]}$F0=@F[0]' file

퍼지는:

if($. == 1 || "$F[0]" ne "$F0" || $F[1] >= $F1 + 10){
    print;
    $F1 = @F[1]
}
$F0 = @F[0]
  • if($.==1||"$F[0]"ne"$F0"||$F[1]>=$F1+10){print;$F1=@F[1]}: 현재 줄의 번호가 인 경우 1현재 줄의 첫 번째 필드는 이전 줄의 첫 번째 필드와 같거나 현재 줄의 두 번째 필드는 이전 줄의 두 번째 필드보다 크거나 같고 현재 줄을 인쇄하고 현재 줄의 값을 할당합니다. 두 번째 필드는 F1;
  • $F0=@F[0]: 현재 줄의 첫 번째 필드 값을 에 할당합니다 F0.
% cat file
Test1,  0.0, 1
Test1,  0.2, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2,  0.3, 3
Test2,  1.0, 5
Test2, 11.0, 7
% perl -lane 'if($.==1||"$F[0]"ne"$F0"||$F[1]>=$F1+10){print;$F1=@F[1]}$F0=@F[0]' file
Test1,  0.0, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2, 11.0, 7

답변3

Python 스크립트 사용:

#! /usr/bin/env python3
import sys
with open (sys.argv[1]) as f:
  rows=[list(map(str.strip, line.split(','))) for line in f.readlines()]
  result=rows[0:1]
  for r in rows:
    if r[0] != result[-1][0] or float(r[1]) >= float(result[-1][1])+10:
      result.append(r)
  print("\n".join([",".join(res) for res in result]))

csvfilter.py위의 스크립트를 복사하여 example.dll이라는 파일에 붙여넣습니다 .
를 사용하여 실행 가능하게 만듭니다 chmod +x csvfilter.py.

그런 다음 csv 파일을 사용하여 명령줄에서 실행하여 인수로 처리할 수 있습니다(질문의 예제를 로 저장했습니다 source.csv).

$ ./csvfilter.py source.csv 
Test1,0.0,1
Test1,10.0,3
Test2,0.1,1
Test2,11.0,7

스크립트는 원본 파일을 수정하지 않고 새 버전을 표준 출력으로 인쇄합니다. 또한 공백을 사용한 이전 서식은 모두 삭제됩니다.

원본 파일을 수정된 버전으로 바꾸려면 출력을 다시 원본 파일로 리디렉션합니다.

$ ./csvfilter.py source.csv > source.csv

수정된 버전을 파일로 저장할 수도 있습니다.

$ ./csvfilter.py source.csv > modified.csv

관련 정보