Aqui está uma divertida. Você pode usar sed
diretamente para retirar todas as cópias da primeira linha e deixar todo o resto no lugar (incluindo a primeira linha).
sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input
1{h;n;}
coloca a primeira linha no espaço de espera, imprime e lê na próxima linha - pulando o restante dos sed
comandos da primeira linha. (Ele também pula o primeiro 1
teste para a segunda linha , mas isso não importa, pois esse teste não se aplicaria à segunda linha.)
G
anexa uma nova linha seguida pelo conteúdo do espaço de espera no espaço do padrão.
/^\(.*\)\n\1$/d
exclui o conteúdo do espaço do padrão (pulando para a próxima linha) se a parte após a nova linha (isto é, o que foi acrescentado do espaço de espera) corresponder exatamente à parte antes da nova linha. É aqui que as linhas que duplicam o cabeçalho serão excluídas.
s/\n.*$//
exclui a parte do texto que foi adicionada pelo G
comando, para que o que é impresso seja apenas a linha de texto do arquivo.
No entanto, como a regex é cara, uma abordagem um pouco mais rápida seria usar a mesma condição (negada) e P
subir para a nova linha se a parte após a nova linha (ou seja, o que foi acrescentado no espaço de espera) não corresponder exatamente à parte antes da nova linha e exclua incondicionalmente o espaço do padrão:
sed '1{h;n;};G;/^\(.*\)\n\1$/!P;d' input
Saída quando dada a sua entrada é:
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