Hier ist eine lustige. Sie können seddirekt verwenden, um alle Kopien der ersten Zeile zu entfernen und alles andere (einschließlich der ersten Zeile selbst) an Ort und Stelle zu lassen.
sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input
1{h;n;}Setzt die erste Zeile in den Haltebereich, druckt sie aus und liest die nächste Zeile ein. Der Rest der sedBefehle für die erste Zeile wird übersprungen . (Es überspringt auch diesen ersten 1Test für die zweite Zeile , aber das spielt keine Rolle, da dieser Test nicht auf die zweite Zeile angewendet worden wäre.)
G Fügt eine neue Zeile, gefolgt vom Inhalt des Haltebereichs, an den Musterbereich an.
/^\(.*\)\n\1$/dlöscht den Inhalt des Musterbereichs (springt also zur nächsten Zeile), wenn der Teil nach der neuen Zeile (dh was aus dem Haltebereich angehängt wurde) genau mit dem Teil vor der neuen Zeile übereinstimmt. Hier werden Zeilen gelöscht, die den Header duplizieren.
s/\n.*$//Löscht den vom GBefehl hinzugefügten Textabschnitt , sodass nur die Textzeile aus der Datei gedruckt wird.
Da Preguläre Ausdrücke jedoch teuer sind, wäre ein etwas schnellerer Ansatz, dieselbe Bedingung (negiert) zu verwenden und bis zum Zeilenumbruch zu drucken, wenn der Teil nach dem Zeilenumbruch (dh was aus dem Laderaum angehängt wurde) nicht genau mit dem Teil übereinstimmt vor dem Zeilenumbruch und dann unbedingt den Musterraum löschen:
sed '1{h;n;};G;/^\(.*\)\n\1$/!P;d' input
Ausgabe, wenn Ihre Eingabe gegeben ist:
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