summaryrefslogtreecommitdiff
path: root/scripts/lib.sh
blob: efe5556e3f28d71e5da8929a7bc232d9c20b970e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Shared helpers for fetch.sh and fetch_tw_daily.sh (source this file).
export LC_ALL=C   # awk/sort numeric and ordering behaviour must not depend on the user locale (e.g. comma decimals)
header="Date,Open,High,Low,Close,Volume"

# merge_into FILE NEWROWS: merge by date (new wins), sorted, warn on >1% close mismatch.
merge_into() {
  local file=$1 new=$2 tmp; tmp=$(mktemp)
  { echo "$header"
    awk -F, -v sym="$(basename "$file" .csv)" '
      FNR == 1 { fileno++ }
      $1 !~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/ { next }
      fileno == 1 { r[$1] = $0; oldclose[$1] = $5; next }
      { if (($1 in oldclose) && oldclose[$1] > 0) {
          d = ($5 - oldclose[$1]) / oldclose[$1]; if (d < 0) d = -d
          if (d > 0.01) printf "  warning: %s %s close %s -> %s (>1%% change; split or capital reduction? re-download from scratch)\n", sym, $1, oldclose[$1], $5 > "/dev/stderr" }
        r[$1] = $0 }
      END { for (d in r) print r[d] }' "$file" "$new" | sort
  } > "$tmp" && mv "$tmp" "$file"
}