Объединение столбцов из двух отдельных файлов

10

Как создать новый файл, объединяющий отдельные столбцы из двух отдельных файлов с помощью awk? Не портя порядок элементов ОБА файлов.

Пример: Файл 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
dovah
источник

Ответы:

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
cuonglm
источник
Спасибо! Я также успешно попробовал этот способ, используя 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выполнит работу при условии, что столбец, который вы хотите сопоставить, отсортирован.

Жиль "ТАК - перестань быть злым"
источник