объединить два файла в один файл с комбинированными столбцами

Я новичок в сценариях linux / unix и стараюсь объединить два файла в один файл со всеми столбцами из обоих файлов.

Я предоставляю свои файлы примеров. Файл 1

chr loc T1 C1 chr1 100 2 3 chr1 200 3 4 chr2 100 1 4 chr2 400 3 1 

Файл 2

 chr loc T2 C2 chr1 100 1 2 chr1 300 4 1 chr2 100 7 5 chr2 500 1 9 

и выходной файл должен быть таким

выходной файл

 chr loc T1 C1 T2 C2 chr1 100 2 3 1 2 chr1 200 3 4 0 0 chr1 300 0 0 4 1 chr2 100 1 4 7 5 chr2 400 3 1 0 0 chr2 500 0 0 1 9 

Возможно ли это с помощью команд linux awk / grep и т. Д.?

One Solution collect form web for “объединить два файла в один файл с комбинированными столбцами”

 join -a1 -a2 -e 0 -o 0,1.2,1.3,2.2,2.3 \ <(sed 's/ \+/_/' file1 | sort) \ <(sed 's/ \+/_/' file2 | sort) | sed 's/_/ /' | column -t | sort 
 chr loc T1 C1 T2 C2 chr1 100 2 3 1 2 chr1 200 3 4 0 0 chr1 300 0 0 4 1 chr2 100 1 4 7 5 chr2 400 3 1 0 0 chr2 500 0 0 1 9 

Самая сложная часть здесь – причины sedjoin будет join только к одному полю, и здесь критерии join – это первые 2 поля. Итак, мы должны объединить эти поля в одно слово: я заменяю первую chr1_100 chr1_200 подчеркивания, так что соединение будет видеть chr1_100 , chr1_200 и т. Д.

join требует сортировки входных файлов.

Я использую замещение процесса, чтобы join могло работать с конвейерами sed|sort такими как файлы.

Затем другой вызов sed чтобы отменить комбинированное поле, а затем column чтобы сделать его красивым.

По умолчанию join использует первое поле каждого файла в качестве поля ключа.

По умолчанию join выполняет внутреннее соединение : печатаются только клавиши, присутствующие в обоих файлах. Параметр -a1 и -a2 позволяет полностью использовать внешнее соединение. Параметр -e предоставляет значение по умолчанию для нулевых полей, и нам нужна опция -o чтобы указать, что мы хотим все поля.


Также можно использовать awk:

 awk ' {key = $1 OFS $2} NR == FNR {f1[key] = $3; f2[key] = $4; next} !(key in f1) {print $1, $2, 0, 0, $3, $4; next} {print key, f1[key], f2[key], $3, $4; delete f1[key]} END {for (key in f1) print key, f1[key], f2[key], 0, 0} ' file1 file2 | sort 
 chr loc T1 C1 T2 C2 chr1 100 2 3 1 2 chr1 200 3 4 0 0 chr1 300 0 0 4 1 chr2 100 1 4 7 5 chr2 400 3 1 0 0 chr2 500 0 0 1 9 
  • команда `highlight`
  • Объединить текстовые файлы с 1-м столбцом и разницу в выходном файле
  • арифметическая операция со столбцами в текстовом файле
  • Как временно отключить клавишу Escape в терминале?
  • Разделить столбцы на основе шаблонов в полях
  • Скрипт для добавления пути к файлу рекурсивно
  • Изменение числа в строке чисел
  • Как я могу использовать строковые манипуляции для обнаружения и удаления двух разных частей строки?
  • sed повторяет последнюю строку в потоке
  • Bash-скрипт обрабатывает текст snmp только для печати желаемого идентификатора
  • Сравните два файла и распечатать совпадения
  • Interesting Posts

    Как регистрировать все события, выполняемые в каталоге?

    Разница между POSIX, спецификацией Single UNIX и базовыми спецификациями Open Group?

    SSH: разрешение отклонено, повторите попытку

    dd нет такого файла или каталога

    Разбиение в awk не на печать значений массива

    Непоследовательное поведение перенаправления ввода

    Что делает CTRL + V в vim?

    Nginx не показывает страницу html по умолчанию

    Установка Swift на Freebsd не может сделать LLVM

    Изменение структуры файла журнала Linux для использования с kst

    Как запустить приложение автоматически при загрузке

    Это хорошая идея использовать «безопасный» режим входа zlogin для выключения зоны?

    Где находится информация о формате файловой системы, хранящемся на внешних жестких дисках

    Какой код запускается, когда я набираю «sudo service nginx start»

    Возможно ли, чтобы контейнер OpenVZ взаимодействовал с базой данных MySQL на хосте?

    Linux и Unix - лучшая ОС в мире.