Kolay kısmı, paste
dosyalarınızın satırlarını birleştirmek için kullanabileceğinizdir . Onun -d
seçenek, bir ayırıcı seçmelerini sağlar (burada bir .
).
Buradaki zor kısım Kartezyen ürünüdür. SO bu cevabını ödünç alarak , şöyle bir komut verebiliriz:
paste -d '.' \
<(sed -n "$(yes 'p;' | head -n $(wc -l <file2.txt) )" file1.txt) \
<(cat $(yes 'file2.txt' | head -n $(wc -l <file1.txt)))
Biz neredeyiz:
- Birleştirin
yes
ve satır sayısına eşit sayıda birkaç satırın her satırını yazdıracak head
bir sed
komut dosyası oluşturun ;file1.txt
file2.txt
- Birleştirin
yes
ve head
yapmak cat
yazdırmak file2.txt
satır sayısına eşit bir kaç kez file1.txt
;
paste
İki işlem yerine basılmış ( <(...)
) ile basılmış her satır çiftini bir ile ayırarak birleştirmek için kullanın .
.
Elbette sonucu diğer komutlara da aktarabilirsiniz.
Ayrıca, komutların çıktısını, bir döngü içinde olsalar bile, diğer cevaplarınızda olduğu gibi yönlendirebileceğinizi unutmayın. Örneğin, dene
while ... do ... done <file | cat -
Kolaylık sağlamak için, bir işlevi tanımlayabilir ve bunu ortamınız için kullanılabilir hale getirebilirsiniz (örneğin, .bashrc
kullanıyorsanız onu tanımlamak gibi bash
).
Burada harici araçlara olan ihtiyacı en aza indirmek için döngüler kullanılıyor:
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"
}
Örnek kullanım:
$ 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