Создайте пары «тег элемента» из списков «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 

5 Solutions collect form web for “Создайте пары «тег элемента» из списков «item, item, … | tag»”

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

 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/' 
  • Как вложить глобальные совпадения с sed?
  • Использование sed / awk для удаления чего-либо после первого пробела
  • ошибка при замене нескольких слов в строке с помощью sed
  • извлечь url между 2 строками в файле
  • печатать все после косой черты
  • Извлечение информации через awk и sed
  • Regex ищет корни слова с общими префиксами
  • как вставить содержимое файла в совпадение с помощью sed - только первое появление
  • заменить строку сложного текста в нескольких файлах
  • sed: многострочная замена блока конфигурации
  • AWK, SED или GREP для извлечения данных из файла HTML
  • Найти файлы, для которых несколько вариантов этого имени файла существуют вместе в одном каталоге
  • Linux и Unix - лучшая ОС в мире.