Вот веселый Вы можете использовать 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