DEV Community

Query Filter
Query Filter

Posted on

smart

#!/bin/bash
# Usage:
#   ./filter.sh file.csv decimals col1 [col2 ... colN]
#
# Example:
#   ./filter.sh data.csv 2 45

if [ "$#" -lt 3 ]; then
    echo "Usage: $0 file.csv decimals col1 [col2 ... colN]"
    exit 1
fi

file="$1"
decimals="$2"
shift 2

cols=$(IFS=,; echo "$*")

awk -F'~' -v OFS='~' -v cols="$cols" -v dec="$decimals" '
BEGIN {
    n = split(cols, cidx, ",")

    # scaling factor: 10^dec
    scale = 1
    for (i = 1; i <= dec; i++) scale *= 10

    fmt = "%." dec "f"
}
{
    for (i = 1; i <= n; i++) {
        col = cidx[i]

        # numeric only
        if ($col ~ /^-?[0-9]+(\.[0-9]+)?$/) {

            # true numeric rounding with epsilon
            val = $col
            rounded = int(val * scale + (val >= 0 ? 0.5 : -0.5)) / scale

            $col = sprintf(fmt, rounded)
        }
    }
    print
}
' "$file"

Enter fullscreen mode Exit fullscreen mode

Top comments (0)