私はデータを検証するために独自の検証フレームワークを使用しています。各検証ジョブには、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