Sáp nhập các cột từ hai tệp riêng biệt


10

Làm cách nào để tạo một tệp mới hợp nhất các cột chọn lọc từ hai tệp riêng biệt bằng awk? Không làm rối các thứ tự các yếu tố của các tập tin CẢ.

Ví dụ: Tệp 3 có thể chứa cột 1,2,3 từ Tệp 1 và cột 4 từ Tệp 2.

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

Câu trả lời:


4

Thử cái này:

$ 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

Cảm ơn! Tôi cũng đã thử thành công cách này bằng cách sử dụng gawk:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah

2
@Dovah: Bạn có thể sử dụng paste file1 file2và sau đó in các trường đã chọn awk.
cuonglm

Điều này lưu trữ file2trong bộ nhớ, có thể bị cấm nếu các tệp lớn. Có một cách đơn giản hơn để làm điều này mà không cần chi phí bộ nhớ (xem câu trả lời của tôi).
Gilles 'SO- ngừng trở nên xấu xa'

17

Có một công cụ dành riêng cho việc đó : paste. Nó nối từng dòng đầy đủ từ tệp đầu tiên với dòng tương ứng từ tệp thứ hai; bạn có thể loại bỏ các cột không mong muốn trước hoặc sau. Ví dụ: giả sử rằng các cột của bạn được phân định bằng tab:

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

Đây là một cách để lọc trước cả hai tệp dựa trên thay thế quá trình ksh / bash / zsh.

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

Awk chủ yếu hướng đến việc xử lý một tệp cùng một lúc, nhưng bạn có thể gọi getlineđể đọc từ một tệp khác song song.

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

Cho đến nay tôi đã giả sử rằng bạn muốn khớp dòng 1 của tệp 1 với dòng 1 của tệp 2, dòng 2 của tệp 1 với dòng 2 của tệp 2, v.v. Nếu bạn muốn khớp nội dung của một cột, đó là một vấn đề hoàn toàn khác joinsẽ thực hiện công việc miễn là cột bạn muốn khớp được sắp xếp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.