Aqui é divertido. Você pode usar sed
diretamente para retirar todas as cópias da primeira linha e deixar todo o restante no lugar (incluindo a primeira linha).
sed '1{h;n;};G;/^\(.*\)\n$/d;s/\n.*$//' input
1{h;n;}
coloca a primeira linha no espaço de armazenamento, imprime e lê na próxima linha - ignorando o restante dos comandos sed
da primeira linha. (Ele também ignora esse primeiro 1
teste para a segunda linha , mas isso não importa, já que o teste não teria sido aplicado na segunda linha.)
G
acrescenta uma nova linha seguida do conteúdo do espaço de espera no espaço padrão.
/^\(.*\)\n$/d
exclui o conteúdo do espaço de padrão (pulando para a próxima linha) se a parte após a nova linha (ou seja, o que foi anexado do espaço de espera) corresponder exatamente à porção anterior à 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 comando G
, de modo que o que é impresso é 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
rint até a nova linha se a parte após a nova linha (ou seja, o que foi anexado do espaço de espera) < em> doesn't corresponde exatamente a parte anterior à nova linha e, em seguida, exclui incondicionalmente o espaço padrão:
sed '1{h;n;};G;/^\(.*\)\n$/!P;d' input
Saída quando dada sua entrada é:
ID Data1 Data2
1 100 100
2 100 200
3 200 100
4 100 100
5 200 200