Diğer dosyadaki her dosya satırına önek ekle


0

File1.txt ve file2.txt adlı iki dosya var, ben file1.txt öneki file1.txt ekini eklemeye çalışıyorum, böylece sonuçları kullanacağım bir sonraki yardımcı programa yönlendirebilirim.

cat file1.txt

aa
bb
cc

cat file2.txt

site.com
site2.com
site3.com

Beklenen sonuç şöyle görünecektir:

aa.site.com
aa.site2.com
aa.site3.com
bb.site.com
bb.site2.com
bb.site3.com
cc.site.com
cc.site2.com
cc.site3.com

Yanıtlar:


1

Bash ile:

while IFS= read -r line1; do while IFS= read -r line2; do echo "$line1.$line2"; done <file2.txt; done <file1.txt

veya

join -j 64 <(sort file1.txt) <(sort file2.txt) -o 1.1,2.1 | sed 's/ /./'

Çıktı:

aa.site.com
aa.site2.com
aa.site3.com
bb.site.com
bb.site2.com
bb.site3.com
cc.site.com
cc.site2.com
cc.site3.com

Cevabınız @Cyrus için teşekkür ederiz, beklendiği gibi çalışır.
Sam

1

Kolay kısmı, pastedosyalarınızın satırlarını birleştirmek için kullanabileceğinizdir . Onun -dseç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 yesve satır sayısına eşit sayıda birkaç satırın her satırını yazdıracak headbir sedkomut dosyası oluşturun ;file1.txtfile2.txt
  • Birleştirin yesve headyapmak catyazdırmak file2.txtsatı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, .bashrckullanı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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.