2つの列の複合固有値に基づいて行をマージできますか?

2つの列の複合固有値に基づいて行をマージできますか?

申し訳ありません。私はLinuxに初めてアクセスし、bashが私が達成しようとしている目標を達成できるかどうかはわかりません。

1列と3列の値が同じであれば、2列の値をマージしたいと思います。この場合、同じエラー説明と同じ売り手がある場合は、RefNoフィールドをコンマでマージしたいと思います。

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

予想される結果:

Error Desc|RefNo|Merchant
===================================
Category code invalid|03077,09877|merchanta
Invalid ID|12345|merchanta
Invalid ID|07323,03523|merchantc
No valid reason|78653|merchantb

私は似たような投稿を見つけましたが、重複した投稿を削除していて、列2を削除してマージしたくありません。 3つの列のうち2つの列の情報に基づいて一意の行を保持します。

答え1

GNUを使用すると、datamash次のことができます。

datamash -t'|' groupby 1,3 collapse 2 < <(tail -n+3 file)

出力:

Category code invalid|merchanta|03077,09877
Invalid ID|merchanta|12345
Invalid ID|merchantc|07323,03523
No valid reason|merchnatb|78653

これにより、最初のフィールドと3番目のフィールドがグループ化され、2番目のフィールドの値が縮小されます。tail -n+32つのヘッダー行をスキップするために使用されます。

これを使用して、awk出力の2番目と3番目の列を置き換えてheadヘッダー行を追加できます。

{
  head -n2 file
  datamash -t'|' groupby 1,3 collapse 2 < <(tail -n+3 file) | 
    awk 'BEGIN{OFS=FS="|"}{print $1,$3,$2}'
}

出力:

Error Desc|RefNo|Merchant
===================================
Category code invalid|03077,09877|merchanta
Invalid ID|12345|merchanta
Invalid ID|07323,03523|merchantc
No valid reason|78653|merchnatb

答え2

私はおそらく何かを見落としているでしょう。おそらくより短くすることができます。しかしこれはうまくいきます:

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
                                }
                        }
                }
            }'

関連情報