2012-05-23 16 views
9

मैं कॉलम 1 के आधार पर दो क्रमबद्ध फ़ाइलों में शामिल होने के लिए मानक जॉइन कमांड का उपयोग कर रहा हूं। कमांड फ़ाइल 1 file2> output_file में शामिल है।एकाधिक फ़ाइलों में शामिल हों

लेकिन मैं एक ही तकनीक का उपयोग कर 3 या अधिक फ़ाइलों में कैसे शामिल हो सकता हूं? फ़ाइल 1 फ़ाइल 2 फ़ाइल 3 में शामिल हों> output_file ऊपर दिए गए आदेश ने मुझे एक खाली फ़ाइल दी। मुझे लगता है कि sed मेरी मदद कर सकता है लेकिन मुझे यकीन नहीं है कि कैसे?

उत्तर

19

man join बनाना होगा।

यदि आपको तीन में शामिल होने की आवश्यकता है, तो आप पहले पहले दो में शामिल हो सकते हैं, फिर तीसरे में शामिल हो सकते हैं।

कोशिश:

join file1 file2 | join - file3 > output 

कि एक मध्यवर्ती temp फ़ाइल बनाने के बिना तीन फाइलों में शामिल होने चाहिए। - में शामिल होने के आदेश बताता है रिकर्सिवली join रों की एक पाइपलाइन का निर्माण करके एक से अधिक फ़ाइलों (एन> = 2) शामिल हो सकते हैं stdin

+0

दूसरे शामिल होने के लिए एक हाइफ़न द्वारा आपका क्या मतलब है ?? क्या यह शामिल होने के लिए एक विशेष प्रतीक है ?? –

+0

मेरा अपडेट देखें। '-' कई यूनिक्स प्रोग्राम द्वारा समझा जाता है क्योंकि stdin/stdout – mata

+0

के लिए शॉर्टेंड के रूप में इसे प्राप्त किया गया है। धन्यवाद। –

0

की दो पंक्तियों में शामिल होने के साथ जुड़ें। यदि आप और अधिक शामिल होना चाहते हैं - इसे जोड़े में करें। पहले दो फाइलों में पहले शामिल हों, फिर परिणाम को तीसरे फ़ाइल के साथ शामिल करें।

2

manjoin का पृष्ठ बताता है कि यह केवल दो फाइलों के लिए काम करता है।

NAME 
     join - join lines of two files on a common field 

SYNOPSIS 
     join [OPTION]... FILE1 FILE2 

यह केवल दो फाइलों के साथ काम करता है: तो आप और मध्यवर्ती फ़ाइल है, जो आपको बाद में हटा सकते हैं, यानी .:

> join file1 file2 > temp 
> join temp file3 > output 
> rm output 
+4

या 'में शामिल होने <(में शामिल होने file1 file2) file3' – Kevin

+0

@Kevin मिठाई! वह नहीं जानता था! – Gnosophilon

9

एक से पहले इनपुट धारा को पढ़ने के लिए:

#!/bin/sh 

# multijoin - join multiple files 

join_rec() { 
    if [ $# -eq 1 ]; then 
     join - "$1" 
    else 
     f=$1; shift 
     join - "$f" | join_rec "[email protected]" 
    fi 
} 

if [ $# -le 2 ]; then 
    join "[email protected]" 
else 
    f1=$1; f2=$2; shift 2 
    join "$f1" "$f2" | join_rec "[email protected]" 
fi 
+0

निश्चित रूप से मेरा पसंदीदा जवाब!हालांकि, मैंने 'join_rec' फ़ंक्शन के बॉडी को इस से बदल दिया:' f1 = $ 1; f2 = $ 2; शिफ्ट 2; यदि [$ # -gt 0]; फिर; "$ f1" "$ f2" में शामिल हों। join_rec - "$ @"; अन्य; "$ f1" "$ f2" में शामिल हों; fi' दूसरे 'if' की आवश्यकता को खत्म करने के लिए। कॉल 'join_rec "$ @" ' – user43791

+0

@ack जैसा दिखता है क्या आउटपुट में फ़ाइल नाम को हेडर के रूप में जोड़ना संभव है? – user1883491

7

मैं जानता हूँ कि यह एक पुरानी है प्रश्न लेकिन भविष्य के संदर्भ के लिए। यदि आप जानते हैं कि जिन फ़ाइलों को आप शामिल करना चाहते हैं, उनमें यहां एक प्रश्न जैसे पैटर्न हैं। file1 file2 file3 ... fileN तो आप बस इस आदेश

cat file* > output 

कहाँ उत्पादन में शामिल हो गए फ़ाइलें जो वर्णमाला के क्रम में जुड़े हुए थे की श्रृंखला हो जाएगा के साथ उन्हें शामिल कर सकते हैं।

+0

यह टेक्स्ट फ़ाइलों के लिए शानदार काम करता है। द्विआधारी फ़ाइलों के बारे में जो अन्य आदेश/संकुल/सॉफ़्टवेयर का उपयोग करके विभाजित किए गए हैं। –

+2

अच्छी तरह से आपके पास प्रत्येक फ़ाइल में शायद कुछ शीर्षलेख है जो इंगित करता है कि यह किस प्रकार की फाइल है, इसलिए यह पर्याप्त नहीं है, लेकिन आपको इसके लिए अन्य प्रश्नों की खोज करनी चाहिए, मुझे यकीन है कि किसी ने इसे हल कर लिया है – rsz

+2

प्रश्न है इनपुट फ़ाइलों में एक साथ संबंधित पंक्तियों में शामिल होने के लिए। उन्हें संगत नहीं। –

3

मैंने इसके लिए एक फ़ंक्शन बनाया है। पहला तर्क आउटपुट फ़ाइल है, बाकी तर्क फाइलें शामिल होने के लिए हैं।

function multijoin() { 
    out=$1 
    shift 1 
    cat $1 | awk '{print $1}' > $out 
    for f in $*; do join $out $f > tmp; mv tmp $out; done 
} 

उपयोग:

multijoin output_file file* 
+0

धन्यवाद, यह उपयोगी था। अगर कोई हेडर जोड़ना चाहता है तो sed -i '1i header_text' output_file –

संबंधित मुद्दे