入力として次のレコードがあります。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
答え2
awk
解決策でないことが問題ない場合は、csvsql
試してみてください。csvkit、これは次のための完璧なツールです。
csvsql -H -d '~' --query '
select a,b,c,d,e,f,g,h,i,j,sum(k),sum(l),sum(m)
from file
group by a,b,c,d,e,f,g,h,i,j
' file
出力:
201901,230615,41302,blank,blank,5,U099164,ARS,blank,30,192,0,16
出力を~
-で区切る必要がある場合| csvformat -D '~'
。
答え3
awkとsedの組み合わせを使用して、次の方法で行いました。
awk -F "~" 'BEGIN{sum=0;add=0;wo=0}{sum=sum+$NF}{add=add+$(NF-2)}{wo=wo+$(NF-1)}END{$NF=" ";$(NF-1)=" ";$(NF-2)=" ";print $0,add,wo,sum}' filename | sed -r "s/\s+/ /g"| sed "s/ /~/g"
出力
awk -F "~" 'BEGIN{sum=0;add=0;wo=0}{sum=sum+$NF}{add=add+$(NF-2)}{wo=wo+$(NF-1)}END{$NF=" ";$(NF-1)=" ";$(NF-2)=" ";print $0,add,wo,sum}' p.txt | sed -r "s/\s+/ /g"| sed "s/ /~/g"
201901~230615~41302~blank~blank~05~U099164~ARS~blank~030~192~0~16
答え4
これにより、a[$1,$2,$3,$4,$5,$6,$7,$8,$9,$10]+=$11
awkはこれをキーとして使用します。$1 SUBSEP $2 SUBSEP $3 SUBSEP $4 SUBSEP $5 SUBSEP $6 SUBSEP $7 SUBSEP $8 SUBSEP $9 SUBSEP $10
ここで、個々の要素は変数の内容にリンクされていますSUBSEP
。デフォルトでは、この値は「\ 034」です。
バラよりhttps://www.gnu.org/software/gawk/manual/html_node/MultiDimension.html
これに対応するには、次のようにします。BEGIN{FS = OFS = SUBSEP = "~"}