perl -F, -lane '
exists $h{$F[0]} or $h[$h{$F[0]}=@h]=$_;
$h=$_; /,false$/ or $_=$h for $h[$h{$F[0]}];
END{ print for @h; }
' duplicates.file
डेटा संरचनाएं:
- हैश
%h
जिनकी कुंजियाँ पहले फ़ील्ड्स हैं (AAA, BBB, CCC, इत्यादि) और संबंधित मान संख्याएँ हैं जिसमें उस क्रम को बताया गया है जिसमें कुंजियाँ मिली थीं। इस प्रकार, जैसे, कुंजी एएए => 0, कुंजी बीबीबी => 1, कुंजी सीसीसी => 2।
- सरणी
@h
जिसके तत्व मुद्रण के क्रम में निहित रेखाएँ हैं। इसलिए यदि डेटा में सत्य और असत्य दोनों पाए जाते हैं, तो गलत मान सरणी में जाएगा। OTW, यदि एक प्रकार का डेटा है, तो वह मौजूद होगा।
एक अन्य तरीका GNU sed का उपयोग कर रहा है:
sed -Ee '
G
/^([^,]*),(false|true)\n(.*\n)?\1,\2(\n|$)/ba
/^([^,]*)(,true)\n(.*\n)?\1,false(\n|$)/ba
/^([^,]*)(,false)\n((.*\n)?)\1,true(\n|$)/{
s//\3\1\2\5/;h;ba
}
s/([^\n]*)\n(.*)$/\2\n\1/;s/^\n*//
h;:a;$!d;g
' duplicates.file
FWIW, उपरोक्त GNU- सेड कोड के लिए POSIX समकक्ष कोड नीचे सूचीबद्ध है:
sed -e '
G
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false$/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false\n/ba
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true$/{
s//\3\1\2/
h
ba
}
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true\n/{
s//\3\1\2\n/
h
ba
}
y/\n_/_\n/
s/\([^_]*\)_\(.*\)$/\2_\1/;s/^_*//
y/\n_/_\n/
h;:a;$!d;g
' duplicates.file
व्याख्या
- इस पद्धति में हम परिणाम को अंत में होल्ड स्पेस में प्रिंट करने के लिए स्टोर करते हैं।
- पढ़ी गई प्रत्येक पंक्ति के लिए, हम होल्ड स्पेस की मौजूदा स्थिति की वर्तमान लाइन की वर्तमान स्थिति की जांच के लिए पैटर्न स्पेस को पकड़ते हैं।
- अब इस तुलना के दौरान 5 चीजें हो सकती हैं:
- a) करेंट लाइन कहीं न कहीं होल्ड लाइन में मौजूद है और गलत: गलत है।
- [क्रिया] चूंकि एक ही झूठी स्थिति पाई जाती है, तो कुछ भी न करें।
- बी) वर्तमान लाइन कहीं न कहीं होल्ड लाइन और सच में मेल खाती है: सच।
- [क्रिया] चूँकि वही सच्ची अवस्था पाई जाती है, तो कुछ भी न करें।
- ग) वर्तमान लाइन कहीं न कहीं होल्ड लाइन और सच में मेल खाती है: असत्य।
- [कार्य] चूंकि एक झूठी स्थिति पहले से मौजूद है, इसलिए कुछ भी न करें।
- d) वर्तमान लाइन कहीं न कहीं होल्ड लाइन में निहित है और गलत: सच है।
- [कार्य] इसमें कुछ काम शामिल हैं, जिसमें हमें झूठी रेखा को उसी स्थान पर बदलने की आवश्यकता है जहां सही स्थित है।
- ई) वर्तमान लाइन होल्ड लाइन में कहीं भी मेल नहीं खाती है।
- [क्रिया] वर्तमान रेखा को अंत तक ले जाएं।
परिणाम
AA,false
BB,false
CC,false
DD,true
true
अगर यह पहले कॉलम का पहला उदाहरण है?