첫 번째 줄을 제외하고 파일에서 추가 헤더 줄을 제거합니다.

첫 번째 줄을 제외하고 파일에서 추가 헤더 줄을 제거합니다.

이 장난감 예제와 비슷한 파일이 있습니다. 내 실제 파일에는 400만 줄이 있는데 그 중 약 10줄을 삭제해야 합니다.

ID  Data1  Data2
1    100    100
2    100    200
3    200    100
ID  Data1  Data2
4    100    100
ID  Data1  Data2
5    200    200

첫 번째 행을 제외하고 헤더처럼 보이는 행을 제거하고 싶습니다.

최종 문서:

ID  Data1  Data2
1    100    100
2    100    200
3    200    100
4    100    100
5    200    200

어떻게 해야 하나요?

답변1

당신은 그것을 사용할 수 있습니다

sed '2,${/ID/d;}'

행 2부터 ID가 있는 행이 삭제됩니다.

답변2

header=$(head -n 1 input)
(printf "%s\n" "$header";
 grep -vFxe "$header" input
) > output
  1. 입력 파일의 헤더 행을 변수로 가져옵니다.
  2. 제목 인쇄
  3. grep헤더와 일치하는 줄을 생략하도록 파일을 처리합니다.
  4. 위 두 단계의 출력을 출력 파일로 캡처합니다.

답변3

교정장치를 좋아하지 않는 분들을 위해

sed -e '1n' -e '/^ID/d'
  • npass행 번호를 나타냅니다 .1
  • d다음으로 시작하는 일치하는 모든 줄을 제거합니다.^ID

답변4

이것은 흥미로운 것입니다. sed을 사용하여 첫 번째 행의 모든 ​​복사본을 삭제하고 다른 모든 항목(첫 번째 행 자체 포함)을 유지할 수 있습니다.

sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input

1{h;n;}sed첫 번째 줄을 예약된 공간에 넣고 인쇄한 후 다음 줄을 읽습니다. 첫 번째 줄의 나머지 명령은 건너뜁니다. (그것도 마찬가지다.1두 번째 줄에서 첫 번째 테스트 건너뛰기하지만 두 번째 행에는 테스트가 적용되지 않으므로 문제가 되지 않습니다. )

G패턴 공간에 개행 문자와 예약된 공간을 추가합니다.

/^\(.*\)\n\1$/d줄 바꿈 뒤의 부분(예: 예약된 공간에서 추가된 부분)이 줄 바꿈 앞 부분과 정확하게 일치하면 패턴 공간의 내용이 삭제됩니다(따라서 다음 줄로 점프). 여기서 중복된 헤더가 있는 행이 제거됩니다.

s/\n.*$//G파일의 텍스트 줄만 인쇄되도록 명령으로 추가된 텍스트 부분을 제거합니다 .

그러나 정규식은 비용이 많이 들기 때문에 약간 더 빠른 방법은 동일한 조건(부정)을 사용하고 P줄바꿈 뒤의 부분(예: 예약된 공간에서 추가된 부분)인 경우 줄바꿈에 인쇄하는 것입니다.아니요개행 앞 부분을 정확히 일치시킨 다음 무조건 패턴 공간을 제거합니다.

sed '1{h;n;};G;/^\(.*\)\n\1$/!P;d' input

입력이 주어지면 출력은 다음과 같습니다.

ID  Data1  Data2
1    100    100
2    100    200
3    200    100
4    100    100
5    200    200

관련 정보