Unir linha de campos para as duas primeiras colunas é igual

1

Estou tentando obter deste arquivo:

A4690021|product.actor|Laurel Cronin
A4690021|product.actor|Bob Hoskins
A4690021|product.actor|Caroline Goodall
A4690021|product.actor|Julia Roberts
A4690021|product.actor|Maggie Smith
A4690021|product.actor|Amber Scott
A4690021|product.actor|Charlie Korsmo
A4690021|product.actor|Robin Williams
A4690021|product.actor|Dustin Hoffman
A4690021|product.director|Steven Spielberg
A4690021|product.bestSellers|Offline Best Seller
A4690021|product.bestSellers|Online Best Seller
A4690021|product.parentCategory.id|999.54215013.999.54216013
A4690021|product.storeName|Cine
A4690021|product.parentCat.displayName|Infantil
A19129625|product.author|. VV.AA.

Este resultado:

A4690021|product.actor|Laurel Cronin,Bob Hoskins,Caroline Goodall,Julia Roberts,Maggie Smith,Amber Scott,Charlie Korsmo,Robin Williams,Dustin Hoffman
A4690021|product.director|Steven Spielberg
A4690021|product.bestSellers|Offline Best Seller,
A4690021|product.parentCategory.id|999.54215013.999.54216013
A4690021|product.storeName|Cine
A4690021|product.parentCat.displayName|Infantil
A19129625|product.author|. VV.AA.

Tentando usar este script awk:

awk -F'|' '{a[$1"|"$2]=a[$1"|"$2]","$3}END{for(x in a)print x""a[x]}' SEARCH_ECISTORE_PRD_MULTI_ES_s.csv

Mas eu não sei porque estou obtendo isso:

A4690021|product.storeName,Cine
A4690021|product.parentCategory.id,999.54215013.999.54216013
A19129625|product.author,. VV.AA.
A4690021|product.director,Steven Spielberg
,Dustin Hoffmanllactor,Laurel Cronin
A4690021|product.parentCat.displayName,Infantil
,Online Best SellerstSellers,Offline Best Seller

Estou tendo um problema ao ler os atores, parece que $ 3 contém o valor adequado, mas ao agregá-los eles se fundem de formas estranhas.

    
por Fernando Rodríguez García 01.08.2016 / 21:39

3 respostas

0

Para corrigir os divisores de campo do último campo:

$ awk -F'|' '{a[$1"|"$2]=a[$1"|"$2]","$3} END{for(x in a)print x"|"substr(a[x],2)}' file.csv
A4690021|product.storeName|Cine
A4690021|product.parentCategory.id|999.54215013.999.54216013
A19129625|product.author|. VV.AA.
A4690021|product.director|Steven Spielberg
A4690021|product.actor|Laurel Cronin,Bob Hoskins,Caroline Goodall,Julia Roberts,Maggie Smith,Amber Scott,Charlie Korsmo,Robin Williams,Dustin Hoffman
A4690021|product.parentCat.displayName|Infantil
A4690021|product.bestSellers|Offline Best Seller,Online Best Seller

Quebra de linha

Vamos converter o arquivo de origem para o formato DOS / Windows:

$ unix2dos <file.csv >file.dos
$ awk -F'|' '{a[$1"|"$2]=a[$1"|"$2]","$3} END{for(x in a)print x"|"substr(a[x],2)}' file.dos
A4690021|product.storeName|Cine
A4690021|product.parentCategory.id|999.54215013.999.54216013
A19129625|product.author|. VV.AA.
A4690021|product.director|Steven Spielberg
,Dustin Hoffmanllactor|Laurel Cronin
A4690021|product.parentCat.displayName|Infantil
,Online Best SellerstSellers|Offline Best Seller

Isso parece com sua saída problemática.

A solução é executar dos2unix ou outro utilitário para remover os terminais de linha DOS / Windows.

    
por 01.08.2016 / 21:48
0

Possível duplicado (porque eu faço algum tempo igual)

sed ':a;$!N;s/\(\(.*|\)[^|]\+\)\n/, /;ta;P;D' SEARCH_ECISTORE_PRD_MULTI_ES_s.csv

produzirá

A4690021|product.actor|Laurel Cronin, Bob Hoskins, Caroline Goodall, Julia Roberts, Maggie Smith, Amber Scott, Charlie Korsmo, Robin Williams, Dustin Hoffman
A4690021|product.director|Steven Spielberg
A4690021|product.bestSellers|Offline Best Seller, Online Best Seller
A4690021|product.parentCategory.id|999.54215013.999.54216013
A4690021|product.storeName|Cine
A4690021|product.parentCat.displayName|Infantil
A19129625|product.author|. VV.AA.
    
por 01.08.2016 / 22:32
0

Com o datamash do GNU:

datamash -t\| -g 1,2 collapse 3 <SEARCH_ECISTORE_PRD_MULTI_ES_s.csv

Resultado:

A4690021|product.actor|Laurel Cronin,Bob Hoskins,Caroline Goodall,Julia Roberts,Maggie Smith,Amber Scott,Charlie Korsmo,Robin Williams,Dustin Hoffman
A4690021|product.director|Steven Spielberg
A4690021|product.bestSellers|Offline Best Seller,Online Best Seller
A4690021|product.parentCategory.id|999.54215013.999.54216013
A4690021|product.storeName|Cine
A4690021|product.parentCat.displayName|Infantil
A19129625|product.author|. VV.AA.
    
por 03.08.2016 / 19:08

Tags