2012-01-13 22 views
8

Infile1:बैश में शामिल होने के आदेश

1 a 
3 c 
4 d 
6 f 

Infile2:

1 a 
2 b 
5 e 
6 f 
7 g 
8 h 

मैं यूनिक्स के साथ इन फ़ाइलों में कैसे शामिल आदेश शामिल होते हैं इस उत्पादन प्राप्त करने के लिए:

1 aa 
2 b 
3 c 
4 d 
5 e 
6 ff 
7 g 
8 h 

Dogbanes काम का जवाब लेकिन ... जब मैं इस फ़ाइल पर dogbanes उत्तर लागू करता हूं:

27 27 
28 22 
29 37 
30 15 
31 21 
32 13 
33 18 
34 24 

और इस:

27 7 
28 13 
29 6 
30 12 
31 30 
32 5 
33 10 
34 28 

वे शामिल नहीं:

27 27 
27 7 
28 13 
28 22 
29 37 
29 6 
30 12 
30 15 
31 21 
31 30 
32 13 
32 5 
33 10 
33 18 
34 24 
34 28 

दूसरे परिदृश्य इतना सीमांकित टैब मैं -t \t

उत्तर

11

पहले sort दोनों फ़ाइलों का उपयोग किया है। फिर दोनों फ़ाइलों के पहले क्षेत्र में शामिल होने के लिए join का उपयोग करें। यदि आप अंतरिक्ष को हटाना चाहते हैं और इस प्रकार a aaa में कनवर्ट करना चाहते हैं तो आपको sed के माध्यम से आउटपुट को पाइप करने की भी आवश्यकता है। यह नीचे दिखाया गया है:

$ join -t " " -1 1 -2 1 -a 1 -a 2 <(sort file1) <(sort file2) | sed 's/ \([a-z]\)/\1/g' 
1 aa 
2 b 
3 c 
4 d 
5 e 
6 ff 
7 g 
8 h 
11

मेरे लिए काम करता है (लगभग)। आपको टैब वर्ण के लिए -t $'\t' निर्दिष्ट करना चाहिए, न केवल -t \t\t की व्याख्या नहीं करता है जब तक कि $'' उद्धरणों में नहीं। दो मामले के लिए

1 aa 
2 b 
3 c 
4 d 
5 e 
6 ff 
7 g 
8 h 

उत्पादन: मामले एक के लिए

awk 'NR==FNR{a[$1]=$2;next;} {a[$1]=($1 in a)?a[$1]$2:$2}END{for(x in a)print x,a[x]}' f1 f2|sort 

उत्पादन:

join -t $'\t' -o 1.2,2.2 <(echo $'27\t27 
28\t22 
29\t37 
30\t15 
31\t21 
32\t13 
33\t18 
34\t24' | sort) <(echo $'27\t7 
28\t13 
29\t6 
30\t12 
31\t30 
32\t5 
33\t10 
34\t28' | sort) 
27  7 
22  13 
37  6 
15  12 
21  30 
13  5 
18  10 
24  28 
4

यह आपके दोनों ही मामलों के लिए काम करना चाहिए

27 277 
28 2213 
29 376 
30 1512 
31 2130 
32 135 
33 1810 
34 2428 
+0

से पूर्ण हो गया। 'If-else' +1 के बजाय 'टर्नरी ऑपरेटर' के उपयोग को पसंद किया :) –

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