आसान हिस्सा यह है कि आप 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