Чтобы получить желаемый результат, если вы разделяете на [,|]
, вы должны дополнительно удалить начало field1 перед выводом результатов. Есть два способа сделать это. Первый способ просто разбивает field1 на массив с fieldsep , равным ' '
, второй - с комбинацией substr, match & length
. Первый - это простой способ сделать это с помощью команды split()
, например,
awk -F '[,|]' '{
split ($1, arr, / /)
for (i=3; i<=NF; i++) {
printf "%s,%s|%s\n", arr[2], $2, $i
}
}' file
Для второго вы можете удалить split()
выше и заменить arr[2]
на:
substr($1,match($1,/ /)+1,length($1)-match($1,/ /))
Если ваш файл данных не содержит "Line[0-9]: "
в качестве префикса для каждой строки, вы можете включить следующее как printf
для обработки любого случая:
printf "%s,%s|%s\n", arr[2]=="" ? arr[1] : arr[2], $2, $i
Результаты одинаковы либо путь, но рекомендуется использовать split()
.
Пример Использование / Вывод
Использование предложенного решения awk
с вашим файлом данных (с именем * 1032) * отрегулируйте по мере необходимости), вы можете просто выбрать-скопировать / вставить среднюю мышь в xterm с помощью file
в текущем каталоге, чтобы получить результаты, например,
$ awk -F '[,|]' '{
> split ($1, arr, / /)
> for (i=3; i<=NF; i++) {
> printf "%s,%s|%s\n", arr[2], $2, $i
> }
> }' file
StringA1, stringB1| stringC1
StringA1, stringB1| stringD1
StringA1, stringB1| stringE1
StringA2, stringB2| stringC2
StringA2, stringB2| stringD2
StringA3, stringB3| stringC3
StringA3, stringB3| stringD3
StringA3, stringB3| stringE3
StringA3, stringB3| stringF3
Просмотрите все и дайте Я знаю, если у вас есть дополнительные вопросы.