2010-04-08 15 views
13

आउटपुट से लाइनों को निकालने के लिए एक अजीब (या sed) एक-लाइनर खोजना यदि पहला फ़ील्ड डुप्लिकेट है।यदि फ़ील्ड डुप्लिकेट है तो लाइन निकालें

डुप्लिकेट लाइनों मैंने देखा है दूर करने के लिए एक उदाहरण है:

awk 'a !~ $0; {a=$0}' 

कोई भाग्य के साथ एक आधार के लिए उपयोग करने की कोशिश की (मैं $ 0 के बदलते सोचा $ 1 के लिए चाल करना होगा, लेकिन काम नहीं लग रहा था)।

+0

आप लाइनों को हटाने के लिए कहा से 'यदि पहले क्षेत्र मैचों' ... क्या? मैंने 'पिछली इनपुट लाइन में पहले फ़ील्ड के समान मूल्य' माना है; एक और व्यक्ति ने 'कुछ विशेष पैटर्न' ग्रहण किया। आप क्या चाहते थे? –

+0

आपका बदला संस्करण 'awk' a! ~ $ 1; {ए = $ 1} ''* मेरे लिए काम करता है * आसन्न डुप्लिकेट के लिए * (एक क्रमबद्ध फ़ाइल)। ** जोनाथन लेफ्लर के ** संस्करण का लाभ यह है कि यह एक असुरक्षित फ़ाइल पर डुप्लिकेट को हटाने के लिए काम करेगा, लेकिन संभावित रूप से बड़ी सरणी बनाने के खर्च पर। –

+0

मुझे लगता है कि मेरी मुख्य समस्या यह थी कि मैं कुछ अलग-अलग प्रकार के फील्ड सेपरेटर्स से निपट रहा था और एफएस को ठीक से परिभाषित नहीं कर रहा था – Kyle

उत्तर

25
awk '{ if (a[$1]++ == 0) print $0; }' "[email protected]" 

यह एक मानक (बहुत सरल) साहचर्य सरणियों के लिए इस्तेमाल करते हैं।

perl -ane 'print if ! $a{$F[0]}++' file 

-a@F सरणी, जो 0
पर शुरू अनुक्रमणित है में लाइन autosplits:

+0

यह काम करता था! मेरे पास एक और बग था जिसे मुझे एहसास नहीं हुआ था कि शायद मुझे भी समस्याएं दे रही हों। धन्यवाद! – Kyle

8

इस डुप्लिकेट

awk '!_[$1]++' file 
+2

सरणी नाम के रूप में '_' का उपयोग गलतफहमी को आमंत्रित करता है - लेकिन यह काम करता है। –

1

दूर करने के लिए कैसे आप पर्ल का उपयोग कर के लिए खुला रहे हैं है %a हैश याद करता है कि पहले फ़ील्ड को पहले से ही देखा जा रहा है


यह संबंधित समाधान हो जाती है अपने क्षेत्र विभाजक एक अल्पविराम है, बल्कि खाली स्थान के

perl -F, -ane 'print if ! $a{$F[0]}++' file 
संबंधित मुद्दे