आसान हिस्सा यह है कि आप pasteअपनी फ़ाइलों की लाइनों को मर्ज करने के लिए उपयोग कर सकते हैं । इसका -dविकल्प आपको एक सीमांकक (यहां, ए .) चुनने देता है ।
यहां का कठिन हिस्सा कार्टेशियन उत्पाद है। एसओ के इस जवाब से दुखी होकर , हम इस तरह एक आदेश के साथ आ सकते हैं:
paste -d '.' \
<(sed -n "$(yes 'p;' | head -n $(wc -l <file2.txt) )" file1.txt) \
<(cat $(yes 'file2.txt' | head -n $(wc -l <file1.txt)))
हम कहाँ:
- सम्मिलित करें
yesऔर headएक sedस्क्रिप्ट बनाने के file1.txtलिए, जिसमें लाइनों की संख्या के बराबर संख्या के प्रत्येक पंक्ति को प्रिंट किया जाएगा file2.txt;
- कम्बाइन
yesऔर headबनाने के लिए catप्रिंट file2.txtमें लाइनों की संख्या के बराबर कई बार file1.txt;
pasteदो प्रक्रिया प्रतिस्थापन ( <(...)) द्वारा अलग की गई प्रत्येक जोड़ी की रेखाओं को मिलाने के लिए प्रयोग करें , a द्वारा अलग .।
बेशक आप अन्य कमांड में परिणाम को पाइप कर सकते हैं।
इसके अलावा, ध्यान दें कि आप हमेशा कमांड के आउटपुट को पाइप कर सकते हैं, भले ही वे एक लूप में हों, जैसा कि इस दूसरे उत्तर में है। जैसे प्रयास करें
while ... do ... done <file | cat -
सुविधा के लिए, आप एक फ़ंक्शन को परिभाषित कर सकते हैं और इसे अपने पर्यावरण के लिए उपलब्ध कर सकते हैं (उदाहरण के लिए .bashrcयदि आप इसका उपयोग करते हैं तो इसे परिभाषित करना bash)।
एक उदाहरण, बाहरी उपकरणों की आवश्यकता को कम करने के लिए छोरों का उपयोग करके:
function cart_prod () {
while IFS= read -r line1; do
while IFS= read -r line2; do
printf '%s.%s\n' "$line1" "$line2"
done <"$2"
done <"$1"
}
नमूना उपयोग:
$ cart_prod file1.txt file2.txt | sort -r
cc.site.com
cc.site3.com
cc.site2.com
bb.site.com
bb.site3.com
bb.site2.com
aa.site.com
aa.site3.com
aa.site2.com