
У меня есть список в следующем формате:
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
чтобы добавить имя группы к каждому посетителю в текущей строке ввода.