Hier ist eine lustige. Sie können sed
direkt 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 sed
Befehle für die erste Zeile wird übersprungen . (Es überspringt auch diesen ersten 1
Test 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$/d
lö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 G
Befehl hinzugefügten Textabschnitt , sodass nur die Textzeile aus der Datei gedruckt wird.
Da P
regulä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