フィルタリングされたデータを新しいファイルにフォーマットするには?

フィルタリングされたデータを新しいファイルにフォーマットするには?

こんにちは。私はファイルからデータを読み取り、各状態を確認し、データ内のトランザクションの総数を増やそうとします。

REDACTED

最終結果は、この形式の新しいファイルとして印刷する必要があります。 結果

これをテンプレートにしたいのですが、各状態をどのように増やすか、正確にその形式でファイルを作成する方法が混乱していますか?

awk -v _State=$State -v _TransactionCount=$transactionCount awk 'BEGIN{ FS=OFS="," }
  arr_state[$2]+=$11
END {
    print "%s\n", "Transaction Count Report"
    for (id in arr_state) {
        print "%-10s %s\n", state, arr_state[state]
    }
}' < "summary.csv" > "transaction-rpt.csv"

答え1

awk 'BEGIN{ FS=OFS="," }
    { arr_state[toupper($2)]+=$11 }
END {
    print "Transaction Count Report"
    for (id in arr_state) {
        printf "%-10s %d\n", id, arr_state[id]
    }
}' infile

答え2

各週に累積する数(2列目の2文字の組み合わせ)が各行に最後に入力されたとします。

$ awk -F, -v OFS='\t' '{ sum[$2] += $NF } END { print "State", "Transaction count"; for (i in sum) print toupper(i), sum[i] }' file.csv
State   Transaction count
OR      366.68
WV      531.13
AK      792.74
AL      477.18
TX      166.62
CA      781.65
FL      88.88
NV      858.58
MN      93.65
GA      171.06
LA      570.32
OK      921.6

これは、出力フィールド区切り文字をOFSコマンドラインのタブ文字に設定し、入力フィールド区切り文字をFSコンマ文字に設定します。これは、入力が次のようになると仮定します。簡単なCSVファイルつまり、カンマで区切られたフィールドを含む行を含むファイルで、フィールドにはカンマや改行文字は含まれていません。

連想配列は、sum2番目のフィールドをキーとして使用し、各行に対してその行の最後のフィールドを使用して合計が増加します。

最後に、単純なヘッダーを印刷し、sum配列に収集されたデータを出力します。

スタンドアロンプ​​ログラムとして、awkコードは次のように書くことができます。

BEGIN {
    FS = ","
    OFS = "\t"
}

{
    sum[$2] += $NF
} 

END {
    print "State", "Transaction count"

    for (i in sum)
        print toupper(i), sum[i]
}

これは次のように使用されます。

$ awk -f script.awk file.csv

int(sum[i]+0.5)単に印刷する代わりに、合計を最も近い整数に丸めますかsum[i]

答え3

パーティーに遅れましたが、許可された回答を完成させ、改善するために、2番目のサンプル入力csvファイルを使用して、各週の男性と女性の結果を配布しました(ファイルのPIIは私が編集しました)。

$ cat infile
c77ea913-c4a2-4ff6-b615-26028b375fda,wye,nnnnnnnnn,[email protected],0,243.54,dddddddddddddddd,8a412563-2956-4bf3-9df3-54277a9799c7,yyyy-mm-dd,ss ssss sssssss, ccccccccc,ca,90000,ddd-ddd-2825
c117f14d-1322-45a9-9f9b-63db5105fd6c,melany,nnnnnnnnn,[email protected],0,23.26,4.dddddddddddddddd,a59201e8-9d3c-4f2b-b1fb-6914895fa5cd,yyyy-mm-dd,aa aaaaaaaaaaa aaa, ccccccccc,wv,25000,ddd-ddd-2869
3153178c-a3fb-44d3-896f-f39da69fe826,obed,nnnnnnnnnn,[email protected],1,477.18,dddddddddddddddd,4724a9c3-fc8a-49d3-956a-b0646364d3ef,yyyy-mm-dd,aaa aaaaa aaaaa,cccccccccccc,al,35000,ddd-ddd-8746
e4eb28e6-f960-49eb-8f5d-361df60f00c7,jerome,nnnnnnnnn,[email protected],1,236.99,dddddddddddddddd,af393a75-6298-4c82-84e0-a778ec9956a2,yyyy-mm-dd,aa aaa aaaaa aaaaaaa,cccccccccccccccc,wv,25000,ddd-ddd-3204
b5c32ded-e769-4c52-a553-e34b548280d0,damiano,nnnnnnnnn,[email protected],1,921.60,dddddddddddddddd,ff06abad-6787-4236-856d-74ec49df3d04,yyyy-mm-dd,aaaa aa aaaaaaaa,cccccccccccc,ok,73000,ddd-ddd-5361

ここで、5番目のフィールドの値は、提供された名前に基づいて、私(疑いもなく問題がある)の性別属性に応じて、女性の場合は「0」、男性の場合は「1」です。

$ awk 'BEGIN {FS=","} 
       {assoc_arr[toupper($12)$5]+=$6} 
       END {for (id in assoc_arr) {
           printf "%-10s %-4s %8.2f\n", substr(id,1,2), substr(id,3), assoc_arr[id]
           }
       }' infile

CA         0      243.54
AL         1      477.18
WV         0       23.26
WV         1      236.99
OK         1      921.60 
  • assoc_arr複合インデックス値を保持する連想配列を作成できます。ここにありますが、利用可能なすべてのフィールドtoupper($12)$5に接続できます。awk
  • 小数点以下の桁数で金額を印刷できるように、行内の操作で%f「数値」(例:)の代わりに「浮動小数点」数値形式(例:)を使用します。%dprintfawk

関連情報