Форматирование данных для разделения записей после запятой с помощью sed или awk

У меня есть данные в формате ниже:

id : 1234, name : ABC, XYZ
 id : 7891, name : MNO

Я пытаюсь получить данные в следующем формате:

id : 1234, name : ABC
 id : 1234, name : XYZ
 id : 7891, name : MNO

Я могу выполнить первую строчку, но как переносить идентификатор во вторую строку?

3 ответа

Решение Awk:

awk '{ $NF=$NF }
 $NF ~ /,/{ 
 gsub(/[[:space:]]*/, "", $NF);
 len=split($NF, a, ",");
 for (i=1; i<=len; i++) { $NF=a[i]; print $0 }
 next 
 }1' FS=' +: +' OFS=' : ' file

Выход:

id : 1234, name : ABC
id : 1234, name : XYZ
id : 7891, name : MNO


Если ваш Input_file такой же, как показано на рисунке, то следующий может вам помочь.

awk -F, '
{
 split($2,array," ");
 print $1","$2;
 for(i=3;i<=NF;i++){
 print $1", "array[1],array[2],$i}
}
' Input_file

Выход будет следующим:

id : 1234, name : ABC
id : 1234, name : XYZ
id : 7891, name : MNO


Еще одно awk-решение

awk -F: '
{
a=split($NF,b,",");
for(i=1;i<=a;i++)
 {
 sub(/^ */,"",b[i]);
 $NF=" "b[i];
 print $0
 }
}
' OFS=: infile

Или с sed

sed -n '
s/.*/&,/
:A
h
s/\(.*:.*:\)\([^,]*\),\(.*\)/\1\3/
x
s/\(.*:.*:\)\([[:blank:]]*\)\([^,]*\),\(.*\)/\1 \3/p
x
/,$/bA
' infile

licensed under cc by-sa 3.0 with attribution.