Unixシェルスクリプトでawkを介してデータを回転させるには?

Unixシェルスクリプトでawkを介してデータを回転させるには?

awkを使用してファイルを回転しようとしています。以下は私の入力ファイルの例です。

P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,F,PP,4,NA,0.2,0.8
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,F,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,BIR,UP,HR,UPE,GSM,S,PP,10,NA,0.2,2
P2P,P2P,MP,KT,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,MM,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2

必要な出力は次のようになります。

AIR,5,1  
AI,1,0.2  
BIR,10,2
  • ここの最初のフィールドはに属します$5
  • 2番目のフィールドは$12(total $12)に属します。
  • 3番目のフィールドは$15(total $15)に属します。

条件は次の条件を満たす必要がありますawk

$3=="MP" && $10=="S" && $5!="MP"

ベストアンサー1

そしてawk

awk -F, '$3=="MP"&&$10=="S"&&$5!="MP"{a[$5]+=$12;b[$5]+=$15}
  END{for(i in a){print i","a[i]","b[i]}}' file

  • -F,区切り記号をに設定します,
  • $3=="MP"&&$10=="S"&&$5!="MP"{...}問題の条件です
    • a[$5]+=$12;b[$5]+=$15aの合計値で配列を入力し、$12の合計値で配列を入力します。b$15
  • END{...}このブロックは、awkすべての行が処理された後に実行されます。
    • for(i in a)a配列を通るループ
    • print i","a[i]","b[i]}配列とそのインデックスの値の両方を印刷します。

出力:

AI,1,0.2
AIR,5,1
BIR,10,2

おすすめ記事