यहाँ एक मजेदार है। आप 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
यदि नई लाइन के बाद वाला भाग (यानी जो होल्ड स्पेस से जोड़ा गया है) के भाग पर मेल नहीं खाता है 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