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

Я новичок в сценариях 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 
  • Заменить заполнители в шаблоне
  • Замена места для команды paste
  • Замена столбца «время» соответствующими значениями
  • Bash-скрипт. Сдвиг секунд
  • Показать скользящее окно вывода из программы
  • Как я могу распечатать полное объявление функции любой функции, которая содержит в себе определенную строку?
  • команда `highlight`
  • Математические операции с входными данными и печатью?
  • Обработка индексных строк
  • Удалить последние n символов из -print0?
  • Сравните два файла и распечатать совпадения
  • Linux и Unix - лучшая ОС в мире.