Скопируйте указанные c элементов в один CSV и вставьте их n количество раз в другой CSV - PullRequest
1 голос
/ 01 августа 2020

Я пытаюсь выполнить sh кое-что, что может показаться довольно простым, но мне это очень тяжело.

У меня два CSV:

file1.csv
HEADER1, HEADER2, HEADER3
item1,  item4,  item7
item2,  item5,  item8
item3,  item6,  item9 

file2.csv
HEADER1, HEADER2
item1,   item3
item1,   item3
item1,   item3
item1,   item3
item2,   item3
item2,   item3

Я хотел чтобы скопировать item7 из file1.csv столько раз, сколько существует item1 в file2.csv (это может быть любое количество раз), сделайте то же самое для item8 в file1.csv и item2 в file2.csv и объедините результаты в новый файл. В результате файл должен выглядеть так:

file3.csv
HEADER1, HEADER2, HEADER3
item1,   item2,   item7
item1,   item2,   item7
item1,   item2,   item7
item1,   item2,   item7
item2,   item2,   item8
item2,   item2,   item8

Я был бы чрезвычайно благодарен, если бы кто-нибудь помог мне с этим. Меня действительно не волнует метод / инструмент, пока результат выглядит как мой пример.

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Предполагая, что второй столбец вашего вывода должен быть item3, а не item2, и ваш фактический файл отсортирован, как ваш пример (Требование для join), и что вы используете версию GNU join(1), чтобы получить опцию --header:

$ join -t, --header -j1 -o 0,2.2,1.3 file1.csv file2.csv
HEADER1, HEADER2, HEADER3
item1,   item3,  item7
item1,   item3,  item7
item1,   item3,  item7
item1,   item3,  item7
item2,   item3,  item8
item2,   item3,  item8
0 голосов
/ 01 августа 2020

, если записи не отсортированы, awk можно легко обработать.

$ awk -F, -v OFS=, 'NR==FNR {a[$1]=$3; next} 
                            {print $0,a[$1]}' file1 file2

HEADER1, HEADER2, HEADER3
item1,   item3,  item7
item1,   item3,  item7
item1,   item3,  item7
item1,   item3,  item7
item2,   item3,  item8
item2,   item3,  item8
...