बैश में किसी अन्य फ़ाइल से आइटम की सूची निकालें


0

किसी फ़ाइल में सूचीबद्ध आइटम को किसी अन्य फ़ाइल (अनियंत्रित) से निकालने के लिए सबसे कुशल विधि (कोई दोहराई गई कमांड निष्पादन नहीं) क्या होगी?

एक आसानी से दूसरी फ़ाइल में गैर-मिलान आइटम की सूची प्राप्त कर सकते हैं

cat first_file.txt second_file.txt | sort | uniq -u

लेकिन यह भी पहली फ़ाइल से सभी बेजोड़ आइटम शामिल होंगे ... अब क्या?

जवाबों:


2

यह awkप्रोग्राम प्रत्येक फ़ाइल के माध्यम से एक सिंगल पास लेता है:

awk '
    NR == FNR {f1[$0] = 1; next}
    !($0 in f1)
' file1 file2

comm इस काम के लिए उपयोगी है। इसे छांटने के लिए इनपुट फ़ाइलों की आवश्यकता होती है:

# output lines unique to file2
comm -13 <(sort file1) <(sort file2)

मुझे इस बात का कोई अंदाजा नहीं है कि !($0 in f1)आंतरिक रूप से कैसे काम करता है, मेरा मतलब है कि अंदर का जागरण । यदि यह सभी ऐरे को स्कैन करता है, तो हमारे पास ओ (एन!) होना चाहिए। : - | तरह यह प्रतीत हो रहा है अत्यधिक अनुकूलित ... आप के बारे में कोई संदर्भ है?
हस्तूर

inऑपरेटर परीक्षण करता है, तो बाएं हाथ संकार्य (साहचर्य या अनुक्रमित) सरणी का एक सूचकांक है। यह एक ओ (1) ऑपरेशन होना चाहिए। Gawk के
ग्लेन जैकमैन

संदर्भ के लिए धन्यवाद। inपूर्ण सरणी f1को केवल एक तत्व को स्कैन करना चाहिए , यहाँ से O (n ^ 2) [पिछली टिप्पणी O (n ^ 2) में BTW इरेटा और O (n!)] नहीं है। मैंने 10 बाइट के साथ 10 ^ 4 तक 32 बाइट्स के 6 यादृच्छिक तार और awkसमाधान को रैखिक रूप से परीक्षण किया : इसे अंदर ऑर्डर करना होगा। ( commसमाधान 10 ^ 4 पर 2x भिन्न होता है, 10 ^ 5 पर 1x और 2x 10 ^ 6, लेकिन मुझे लगता है कि यह उपलब्ध स्मृति से निर्भर करता है)।
हस्त्तूर

कूल, मुझे इसके बारे में पता नहीं था comm
ड्रोनस

एक ही बात grepइस तरह से की जा सकती है :grep -v -f <(command1) <(command2)
एंडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.