이 장난감 예제와 비슷한 파일이 있습니다. 내 실제 파일에는 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
- 입력 파일의 헤더 행을 변수로 가져옵니다.
- 제목 인쇄
grep
헤더와 일치하는 줄을 생략하도록 파일을 처리합니다.- 위 두 단계의 출력을 출력 파일로 캡처합니다.
답변3
교정장치를 좋아하지 않는 분들을 위해
sed -e '1n' -e '/^ID/d'
n
pass
행 번호를 나타냅니다 .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