Oto zabawny. Możesz użyć sed
bezpośrednio do usunięcia wszystkich kopii pierwszego wiersza i pozostawienia wszystkiego na swoim miejscu (w tym samego pierwszego wiersza).
sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input
1{h;n;}
umieszcza pierwszy wiersz w polu wstrzymania, drukuje go i czyta w następnym wierszu - pomijając pozostałe sed
polecenia dla pierwszego wiersza. ( Pomija1
również ten pierwszy test dla drugiej linii , ale to nie ma znaczenia, ponieważ test ten nie miałby zastosowania do drugiej linii).
G
dołącza znak nowej linii, a następnie zawartość przestrzeni wstrzymania do obszaru wzoru.
/^\(.*\)\n\1$/d
usuwa zawartość przestrzeni wzorów (tym samym przechodząc do następnego wiersza), jeśli część po nowej linii (tj. ta, która została dodana z przestrzeni wstrzymania) dokładnie pasuje do części przed nową linią. To tutaj wiersze, które duplikują nagłówek, zostaną usunięte.
s/\n.*$//
usuwa część tekstu dodaną przez G
polecenie, dzięki czemu drukowana jest tylko linia tekstu z pliku.
Ponieważ jednak wyrażenie regularne jest drogie, nieco szybszym podejściem byłoby użycie tego samego warunku (zanegowanie) i P
zerwanie do nowej linii, jeśli część po nowej linii (tj. To, co zostało dodane z przestrzeni wstrzymania) nie pasuje dokładnie do części przed znakiem nowej linii, a następnie bezwarunkowo usuń przestrzeń wzorców:
sed '1{h;n;};G;/^\(.*\)\n\1$/!P;d' input
Dane wyjściowe po podaniu danych wejściowych to:
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