ここに楽しいものがあります。sed直接使用して、最初の行のすべてのコピーを削除し、他のすべてをそのままにしておくことができます(最初の行自体を含む)。
sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input
1{h;n;}最初の行を保留スペースに入れて印刷し、次の行を読み取りsedます。最初の行の残りのコマンドをスキップします。(2行目の最初の1テストもスキップしますが、そのテストは2行目に適用されないので問題ありません。)
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