Gerar pares de "tag de item" de listas "item, item,… | tag" [closed]

2

As características dos dados de entrada:

  • Cada linha consiste em dois campos, separados por um pipe '|', onde
  • o primeiro campo é uma lista de itens separados por vírgulas e
  • o segundo campo é uma tag.

Entrada

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

Saída

100acct
210acct
354acct
462acct
331mis
746mis
50mis
90sales
263sales
47sales
14sales
    
por loganaayahee 09.10.2012 / 12:33

5 respostas

6

Supondo que os itens não contenham “|” e as tags não contenham “,”:

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

PERL fará?

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

Solução sed pura:

sed ':a;s/\(.*\),\([^,]*\)|\(.*\)/\n|/;ta;s/|//' input.file
    
por 09.10.2012 / 14:39
1

E agora, no bash e no sed:

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

E apenas no bash (cortesia de Nahuel Fouilleul):

 while IFS="|" read i t;do while read -d, j;do echo "$j$t";done <<<"$i,";done <test.txt
    
por 09.10.2012 / 13:52
-1

Sed ...

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

se o primeiro campo não for numérico, ele poderá ser alterado para algo como

sed -e 's/^\([^,][^,]*\),.*|\(.*\)//'
    
por 09.10.2012 / 12:49

Tags