Об’єднання стовпців з двох окремих файлів


10

Як створити новий файл, що об'єднує вибіркові стовпці з двох окремих файлів за допомогою awk? Не псуючи елементи замовлень BOTH-файлів.

Приклад: Файл 3 може містити стовпчик 1,2,3 з Файлу 1 та стовпець 4 з Файлу 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

Відповіді:


4

Спробуйте це:

$ 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

Дякую! Я також успішно спробував цей спосіб, використовуючи gawk:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah

2
@Dovah: Ви можете використовувати paste file1 file2та друкувати вибрані поля в awk.
cuonglm

Це зберігає file2в пам'яті, що може бути непомірно, якщо файлів є великими. Існує простіший спосіб зробити це без накладних витрат на пам'ять (див. Мою відповідь).
Жил 'ТАК - перестань бути злим'

17

Там є спеціальний інструмент для цього: paste. Він поєднує кожен повний рядок з першого файлу з відповідним рядком з другого файлу; ви можете видалити небажані стовпці до або після. Наприклад, якщо припустити, що для ваших стовпців розміщено вкладки:

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

Ось спосіб попередньо фільтрувати обидва файли, які покладаються на заміну процесу ksh / bash / zsh.

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

Awk в основному орієнтований на обробку одного файлу за один раз, але ви можете закликати getlineпаралельно читати з іншого файлу.

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

Поки я вважав, що ви хочете зіставити рядок 1 файлу 1 з рядком 1 файлу 2, рядок 2 файлу 1 з рядком 2 файлу 2 тощо. Якщо ви хочете відповідати вмісту стовпця, це зовсім інша матерія. joinзробить роботу за умови, що стовпчик, з яким потрібно відповідати, відсортований.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.