awkコマンドを使用して次のレコードを集計する方法

awkコマンドを使用して次のレコードを集計する方法

入力として次のレコードがあります。abc.dat

201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~12~0~1

これで、フィールド1〜10のグループ化に基づいてフィールド11、12、13を集計する必要があります。

したがって、私の出力は次のようになります。

201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~192~0~16

以下を試しました。

awk 'BEGIN{FS=OFS="~";}{a[$1,$2,$3,$4,$5,$6,$7,$8,$9,$10]+=$11;b[$1,$2,$3,$4,$5,$6,$7,$8,$9,$10]+=$12;c[$1,$2,$3,$4,$5,$6,$7,$8,$9,$10]+=$13} END {for (i in a) print i,a[i],b[i],c[i]}' abc.dat > abc1.dat

ただし、出力は次のようになります。

201901^Y230615^Y41302^Yblank^Yblank^Y05^YU099164^YARS^Yblank^Y030~192~0~16

追加の^Y記号が提供されます。

ベストアンサー1

本当に変です。配列キー内で使用すると、awk窒息しているように見えます。~たぶん、一致演算子のためかもしれませんが、~わかりません。それにもかかわらず、これは必要に応じて機能します。

$ awk 'BEGIN{FS=OFS="~";}
       {
        key=$1"~"$2"~"$3"~"$4"~"$5"~"$6"~"$7"~"$8"~"$9"~"$10;
        a[key]+=$11;
        b[key]+=$12;
        c[key]+=$13
       } 
       END {
        for (i in a){
         print i,a[i],b[i],c[i]
       }
    }' file 
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~192~0~16

おすすめ記事