นี่คือความสนุก คุณสามารถใช้sed
โดยตรงเพื่อดึงสำเนาทั้งหมดของบรรทัดแรกออกและปล่อยให้ทุกอย่างอยู่ในตำแหน่ง (รวมถึงบรรทัดแรกเอง)
sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input
1{h;n;}
วางบรรทัดแรกลงในพื้นที่พักพิมพ์และอ่านในบรรทัดถัดไปโดยข้ามsed
คำสั่งที่เหลือสำหรับบรรทัดแรก (นอกจากนี้ยังข้าม1
การทดสอบครั้งแรกสำหรับบรรทัดที่สองแต่ไม่สำคัญว่าการทดสอบนั้นจะไม่นำไปใช้กับบรรทัดที่สอง)
G
ต่อท้ายบรรทัดใหม่ตามด้วยเนื้อหาของพื้นที่พักไว้กับพื้นที่รูปแบบ
/^\(.*\)\n\1$/d
ลบเนื้อหาของพื้นที่รูปแบบ (เช่นการข้ามไปที่บรรทัดถัดไป) หากส่วนหลัง newline (เช่นสิ่งที่ถูกต่อท้ายจากพื้นที่พัก) ตรงกับส่วนก่อนหน้าขึ้นบรรทัดใหม่ นี่คือที่บรรทัดที่ทำซ้ำส่วนหัวจะถูกลบ
s/\n.*$//
ลบส่วนของข้อความที่เพิ่มโดยG
คำสั่งเพื่อให้สิ่งที่ได้รับการพิมพ์เป็นเพียงบรรทัดของข้อความจากไฟล์
อย่างไรก็ตามเนื่องจาก regex มีราคาแพงวิธีที่เร็วกว่าเล็กน้อยคือการใช้เงื่อนไขเดียวกัน (เมื่อตะกี้) และP
วิ่งขึ้นบรรทัดใหม่หากส่วนหลัง newline (เช่นสิ่งที่ต่อท้ายจากพื้นที่พัก) ไม่ตรงกับส่วนที่แน่นอน ก่อนขึ้นบรรทัดใหม่แล้วลบพื้นที่รูปแบบโดยไม่มีเงื่อนไข
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