Я бы не использовал awk
для этого, я бы использовал пару вызовов join
:
$ join -t'|' -j1 -a1 -a2 -e NULL -o 0,1.2,1.3,1.4,2.2,2.3,2.4 \
<(join -t'|' -j1 -a1 -a2 -e NULL -o 0,1.2,2.2,2.3 file1.csv file2.csv) \
file3.csv
1|abc|123|jojo|NULL|NULL|NULL
1|abc|NULL|bibi|NULL|NULL|NULL
1|def|123|jojo|NULL|NULL|NULL
1|def|NULL|bibi|NULL|NULL|NULL
2|ghi|NULL|NULL|1a2b|1994|US
2|jkl|NULL|NULL|1a2b|1994|US
3|mno|789|zaza|3c4e|1995|MG
3|mno|012|NULL|3c4e|1995|MG
3|pqr|789|zaza|3c4e|1995|MG
3|pqr|012|NULL|3c4e|1995|MG
4|NULL|NULL|NULL|5f6g|1996|FR
(для этого требуется, чтобы все файлы были отсортированы в первом столбце, как они есть в вашем примере, и оболочка типа bash
, zsh
или ksh93
, поддерживающая перенаправление <(command)
.
Аргументы и их значения: -t'|'
использует pipe в качестве разделителя столбцов, -j1
использует первый столбец в качестве поля соединения, -a1 -a2
выполняет полное внешнее объединение двух файлов, -e NULL
использует значение NULL
для пустых столбцов и -o column-spec
контролирует, какие столбцы включены в вывод. (Требуется с опциями -a
для получения полных результатов).