
Desculpe, sou muito novo no Linux e não tenho certeza da capacidade do bash para o que desejo alcançar.
Quero mesclar os valores da coluna 2 se os valores da coluna 1 e da coluna 3 forem idênticos. Nesse caso, se houver as mesmas descrições de erro e o mesmo comerciante, desejo mesclar os campos RefNo por vírgula.
Error Desc|RefNo|Merchant
===================================
Category code invalid|03077|merchanta
Category code invalid|09877|merchanta
Invalid ID|12345|merchanta
Invalid ID|07323|merchantc
Invalid ID|03523|merchantc
No valid reason|78653|merchantb
Resultado esperado:
Error Desc|RefNo|Merchant
===================================
Category code invalid|03077,09877|merchanta
Invalid ID|12345|merchanta
Invalid ID|07323,03523|merchantc
No valid reason|78653|merchantb
Postagens semelhantes que encontrei, mas estão removendo duplicatas e não quero remover e mesclar a coluna 2. Manter linhas exclusivas com base nas informações de 2 de três colunas.
Responder1
Com o GNU datamash
você poderia fazer:
datamash -t'|' groupby 1,3 collapse 2 < <(tail -n+3 file)
Saída:
Category code invalid|merchanta|03077,09877
Invalid ID|merchanta|12345
Invalid ID|merchantc|07323,03523
No valid reason|merchnatb|78653
Isso agrupa o primeiro e o terceiro campo e recolhe os valores do segundo campo. O tail -n+3
é usado para pular as duas linhas do cabeçalho.
Você poderia usar awk
para trocar a segunda e terceira coluna da saída e head
adicionar as linhas de cabeçalho:
{
head -n2 file
datamash -t'|' groupby 1,3 collapse 2 < <(tail -n+3 file) |
awk 'BEGIN{OFS=FS="|"}{print $1,$3,$2}'
}
Saída:
Error Desc|RefNo|Merchant
===================================
Category code invalid|03077,09877|merchanta
Invalid ID|12345|merchanta
Invalid ID|07323,03523|merchantc
No valid reason|78653|merchnatb
Responder2
Provavelmente estou negligenciando algo - provavelmente é possível encurtar isso - mas funciona:
awk '
BEGIN { FS="|"; OFS="|" }
NR <= 2
NR > 2 {
seen_desc[$1]++
seen_merc[$3]++
if (ref[$1,$3] == "")
ref[$1,$3] = $2
else
ref[$1,$3] = ref[$1,$3] "," $2
}
END {
for (desc in seen_desc) {
for (merc in seen_merc) {
if (ref[desc,merc] != "") {
print desc, ref[desc,merc], merc
}
}
}
}'