kornshellで特定の日付で指定された列の値を合計する方法は?

kornshellで特定の日付で指定された列の値を合計する方法は?

私はデータを検証するために独自の検証フレームワークを使用しています。各検証ジョブには、SQLジョブとそれに付随するKSHジョブ(kornshell)があります。 SQLはデータベースの内容を照会するため、KSHはデータファイルを照会するためにDB(SQL)と同じロジックを使用する必要があります。

現在のSQL文は、ハードコーディングされた日付に基づいて集計列の合計を照会し、値を提供します。以下のKSHファイルからそのコンテンツをどのようにコピーできますか?

現在私のKSHコードは次のとおりです。

cat /textfile.txt | > ${OUTPUT_FILE}

したがって、このKSHがすべきことは、与えられた日付の特定の列の合計を提供することです。その日付の記録がいくつかあります。

データ例:

Date  | Money
--------------
1/1/15 : $15
2/2/15 : $14
3/3/16 : $25
etc... : etc...

予想出力:2015年1月1日から2015年1月31日までの総額(金額)です。

ベストアンサー1

正確な構文は正確な入力に依存します。値フィールドが常に開始されると、<space><dollar>awk ステートメントを使用できます。

awk -F: '$2 ~ /^ \$/ { a[$1]+=substr($2,3)} END {for (b in a) { print b"$"a[b]}}'

例えば

awk -F: '$2 ~ /^ \$/ { a[$1]+=substr($2,3)} END {for (b in a) { print b"$"a[b]}}' testfile.txt
3/3/16 $25
2/2/15 $14
1/1/15 $15

注:区切り文字が実際にaであり、|aではない場合は、:実行する必要がありますawk -F'|' ...

仕組みは次のとおりです。

$2 ~ /^ \$/ - 2番目のフィールドで始まる各行について<space><dollar>

{ a[$1]+=substr($2,3)}- 2番目のフィールドの内容(最初の2文字を除く)を日付別にインデックス付きの配列に追加します。

END {for (b in a) { print b"$"a[b]}}'- ファイルが終わったら、私たちが見つけたすべての日付を見て合計を印刷します。

したがって、デフォルトでは、配列aは日付別にインデックス付けされ、その日付の値の合計が含まれます。

おすすめ記事