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は日付別にインデックス付けされ、その日付の値の合計が含まれます。

答え2

さて、kshで必要な場合は、次の例が役に立ちます。

私が使用したデータファイル:

Date  | Money
--------------
1/1/15 : $15
2/2/15 : $14
3/3/16 : $25
1/2/15 : $10
2/1/15 : $35
3/2/15 : $7

パスワード:

#!/bin/ksh

typeset -A SUM_ARRAY

IN_FILE="$1"

if [[ -z $IN_FILE ]]; then
        print "Usage : script.sh {input filename}"
        exit
fi


while read line;
do
        temp_array=($line)
        if [[ ! ${temp_array[0]} =~ ^(-*)$ && ${temp_array[0]} != "Date" ]]; then
                idx=$(date -d ${temp_array[0]} +"%Y%m")
                SUM_ARRAY[$idx]=$((${SUM_ARRAY[$idx]}+${temp_array[2]#\$*}))
        fi
done < $IN_FILE

print "YearMonth\tSum"

for idx in ${!SUM_ARRAY[@]}; do
        print "$idx\t\t${SUM_ARRAY[$idx]}"
done

結果:

YearMonth       Sum
201501          25
201502          49
201503          7
201603          25

関連情報