Đây là một niềm vui. Bạn có thể sử dụng sed
trực tiếp để loại bỏ tất cả các bản sao của dòng đầu tiên và để mọi thứ khác vào vị trí (bao gồm cả dòng đầu tiên).
sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input
1{h;n;}
đặt dòng đầu tiên vào không gian giữ, in nó và đọc trong dòng tiếp theo, bỏ qua các sed
lệnh còn lại cho dòng đầu tiên. (Nó cũng bỏ qua 1
thử nghiệm đầu tiên cho dòng thứ hai , nhưng điều đó không quan trọng vì thử nghiệm đó sẽ không áp dụng cho dòng thứ hai.)
G
nối thêm một dòng mới theo sau là nội dung của không gian giữ vào không gian mẫu.
/^\(.*\)\n\1$/d
xóa nội dung của không gian mẫu (do đó bỏ qua dòng tiếp theo) nếu phần sau dòng mới (nghĩa là phần được nối từ không gian giữ) khớp chính xác với phần trước dòng mới. Đây là nơi các dòng trùng lặp tiêu đề sẽ bị xóa.
s/\n.*$//
xóa phần văn bản đã được thêm bởi G
lệnh, để những gì được in chỉ là dòng văn bản từ tệp.
Tuy nhiên, vì regex rất tốn kém, nên cách tiếp cận nhanh hơn một chút là sử dụng cùng một điều kiện (phủ định) và P
chuyển sang dòng mới nếu phần sau dòng mới (nghĩa là phần được thêm vào từ không gian giữ) không khớp chính xác với phần trước dòng mới và sau đó xóa vô điều kiện không gian mẫu:
sed '1{h;n;};G;/^\(.*\)\n\1$/!P;d' input
Đầu ra khi cho đầu vào của bạn là:
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