Создайте пары «тег элемента» из списков «item, item, … | tag»

Характеристики входных данных:

  • Каждая строка состоит из двух полей, разделенных трубой '|', где
  • первое поле представляет собой список элементов, разделенных запятыми, и
  • второе поле является тегом.

вход

100,210,354,462|acct 331,746,50|mis 90,263,47,14|sales 

Вывод

 100acct 210acct 354acct 462acct 331mis 746mis 50mis 90sales 263sales 47sales 14sales 

Предполагая, что элементы не содержат «|», а теги не содержат «,»:

 awk -F '[,|]' '{for(i=1;i<NF;i++)print$i$NF}' input.txt 

Сделают ли PERL?

 $ perl -ne 'chomp; @a=split(/\|/); @b=split(/,/,$a[0]); map{print "$_$a[1]\n"}@b' input.txt 

Чистое решение:

 sed ':a;s/\(.*\),\([^,]*\)|\(.*\)/\2\3\n\1|\3/;ta;s/|//' input.file 

И теперь, только в bash и sed:

 cat test.txt| while IFS="|" read it ; do echo $i | sed "s/\([0-9]\+\)/\1$t/g;s/,/\n/g" ; done 

И только в bash (любезность Nahuel Fouilleul):

  while IFS="|" read it;do while read -d, j;do echo "$j$t";done <<<"$i,";done <test.txt 

Сед …

 sed -e 's/^\([0-9][0-9]*\),.*|\(.*\)/\1\2/' 

если первое поле не числовое, тогда его можно изменить на что-то вроде

 sed -e 's/^\([^,][^,]*\),.*|\(.*\)/\1\2/'