재미있는 것이 있습니다. 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
{ IFS= read -r head; printf '%s\n' "$head"; grep -vF "$head" ; } <file