İki ayrı dosyadan sütunları birleştirme


10

Awk kullanarak iki ayrı dosyadan seçici sütunları birleştiren yeni bir dosya nasıl oluşturulur? BOTH dosyalarının eleman siparişlerini bozmadan.

Örnek: Dosya 3, Dosya 1'den 1,2,3 sütununu ve Dosya 2'den sütun 4'ü içerebilir.

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5

Yanıtlar:


4

Bunu dene:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5

Teşekkürler! Ben de başarıyla gawk kullanarak bu şekilde denedim:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah

2
@Dovah: paste file1 file2içindeki seçili alanları kullanabilir ve yazdırabilirsiniz awk.
cuonglm

Bu file2, dosyalar büyükse engelleyici olabilen bellekte depolar . Bunu bellek yükü olmadan yapmanın daha basit bir yolu var (cevabıma bakın).
Gilles 'SO- kötü olmayı bırak'

17

Bunun için özel bir alet var: paste. İlk dosyadaki her tam satırı, ikinci dosyadaki karşılık gelen satırla birleştirir; istenmeyen sütunları önce veya sonra kaldırabilirsiniz. Örneğin, sütunlarınızın sekmeyle ayrılmış olduğunu varsayarsak:

paste file1.txt file2.txt | cut -f 1,2,3,6

Burada, ksh / bash / zsh işlem ikamesine dayanan her iki dosyayı önceden filtrelemenin bir yolu vardır.

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

Awk öncelikle tek seferde bir dosyayı işlemeye yöneliktir, ancak getlineparalel olarak başka bir dosyadan okumaya çağrı yapabilirsiniz .

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt

Şimdiye kadar, dosya 1'in satır 1'ini dosya 2'nin satır 1'i, dosya 1'in satır 2'sini dosya 2'nin satır 2'si ile eşleştirmek istediğinizi varsaydım. Bir sütunun içeriğini eşleştirmek istiyorsanız, bu bir tamamen farklı bir konu. joineşleştirmek istediğiniz sütunun sıralanması koşuluyla işi yapar.

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.