Как объединить, объединить несколько файлов с дубликатом ключа и заполнить пустые столбцы с помощью AWK - PullRequest
0 голосов
/ 17 января 2020

Объединяйте и объединяйте несколько файлов с повторяющимся ключом и заполняйте пустые столбцы

У меня есть много файлов, которые я хочу объединить:

file1.csv:

1|abc
1|def
2|ghi
2|jkl
3|mno
3|pqr

file2.csv:

1|123|jojo
1|NULL|bibi
3|789|zaza
3|012|NULL

file3.csv:

2|1a2b|1994|US
3|3c4e|1995|MG
4|5f6g|1996|FR

Мой желаемый вывод выглядит так: сохраните дубликат ключа и заполните его данными чужих файлов и пустотой столбцы заполняются NULL:

1|abc|123|jojo|NULL|NULL|NULL
1|def|123|jojo|NULL|NULL|NULL
1|abc|NULL|bibi|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|pqr|789|zaza|3c4e|1995|MG
3|mno|012|NULL|3c4e|1995|MG
3|pqr|012|NULL|3c4e|1995|MG
4|NULL|NULL|NULL|5f6g|1996|FR

Как это сделать с помощью одного сценария awk или за 2 шага?

1 Ответ

0 голосов
/ 17 января 2020

Я бы не использовал 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 для получения полных результатов).

...