2009-09-25 12 views
5

मैं कमांड के परिणामों के साथ कई फाइलों है: uniq -c some_file> some_file.outमर्ज परिणाम -c

उदाहरण के लिए: 1.out:

 
1 a 
2 b 
4 c 

2.out

 
2 b 
8 c 

मैं इन परिणामों मर्ज करना चाहते हैं, तो मैं मिलता है:

 
1 a 
4 b 
12 c 

मैंने सोचा कि सॉर्ट या यूनिक इसे संभाल सकता है लेकिन मुझे इससे संबंधित कोई विकल्प नहीं दिख रहा है। कुछ रूबी/पर्ल स्क्रिप्ट लिखना एक तरीका है, लेकिन मैं इसे कोर * निक्स कमांड (जैसे उल्लिखित सॉर्ट और यूनिक) के साथ आसानी से करना चाहता हूं।

संपादित करें: स्पष्ट होने के लिए। मेरे पास मूल फ़ाइलें नहीं हैं और मुझे * .out फ़ाइलों को मर्ज करना है।

मदद के लिए धन्यवाद!

+0

मुझे लगता है कि केवल एक समाधान, अजीब और expr शामिल समाधान होना चाहिए। –

उत्तर

3

awk साथ यह प्रयास करें:

awk '{ count[$2] += $1 } END { for(elem in count) print count[elem], elem }' 1.out 2.out 
+0

ठीक है, यह मेरे लिए काम करना चाहिए। यह आदर्श नहीं है क्योंकि मैं ओ (एन) मेमोरी उपयोग के साथ ऐसा करने की उम्मीद करता हूं, जहां एन फाइलों की संख्या है लेकिन यह कुछ समय तक काम करेगा (जब तक मेरे पास बड़े नतीजे न हों)। धन्यवाद! – radarek

+0

मुझे नहीं लगता कि यह फाइलों की संख्या में रैखिक है क्योंकि 'awk' अनुक्रम में सभी फ़ाइलों को एक समय में पढ़ता है, और इसे केवल स्मृति में 'count' array (हैश तालिका?) रखने की आवश्यकता है। – Philipp

+0

मैंने यह नहीं कहा कि फिलिप द्वारा दिया गया समाधान रैखिक है। मैंने कहा कि इसे ऐसा समाधान लिखा जा सकता है। – radarek

0

यह काफी एक विशिष्ट समस्या है, तो यह संभव नहीं दिखता किसी भी उपकरण डिफ़ॉल्ट रूप से यह कर देगा है। आप किसी भी स्क्रिप्टिंग भाषा (यहां तक ​​कि sh) में लागू एक छोटे पर्याप्त लूप (अजीब बुराई की कोई ज़रूरत नहीं) में इसे स्क्रिप्ट कर सकते हैं। मुझे नहीं लगता कि एक और तरीका है।

0

यह काफी गंभीर नहीं है (लेकिन यह काम करता है)। मुझे फिलिप्स समाधान पसंद है।

cat 1.out 2.out | 
{ 
    while read line; do 
     for i in $(seq ${line% *}); do 
      echo ${line#* } 
     done 
    done 
} | sort | uniq -c