Создание нового списка из существующего на основе первого столбца

Создание нового списка из существующего на основе первого столбца

У меня есть список в следующем формате:

group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5

Из списка выше мне нужно сформировать список следующим образом:

group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5

решение1

Этооченьпохожий наИспользование AWK для массиваи еще несколько вопросов. Основная идея — печатать каждое поле, начиная со второго, на отдельной строке, предваряемой первым полем.

В этом случае мы указываем, что разделитель полей — это либо , ,либо ;, а также следим за тем, чтобы не печатать пустые поля (в конце первой строки данных есть пустое поле). Переменная, OFSкоторую мы устанавливаем в командной строке, -v— это строка разделителя вывода, которая будет использоваться для разграничения полей вывода, и NFэто количество полей в строке.

awk -F '[,;]' -v OFS=',' '{ for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file

Учитывая данные в вопросе, это генерирует

group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5

решение2

Это можно сделать с помощью GNU sed следующим образом:

sed -r 's:,$::;y:;,:,;:;:l;s:^(([^,]+)[^;]+);:\1\n\2,:;tl' file

Для каждой строки ввода я удаляю конечную запятую, если она есть, затем я меняю запятые на точки с запятой, чтобы облегчить печать. После этого я запускаю цикл поиска и замены между :lи , tlчтобы добавить имя группы к каждому посетителю в текущей строке ввода.

Связанный контент