#!/bin/bash
: '
linear_convert - CSVファイルの指定列を線形変換し出力するスクリプト
Usage:
./linear_convert <a: slope> <b: intercept> <column_num> <precision> <input_csv_file> [na_replacement|keep]
Arguments:
a 傾き(線形変換の倍率)
b 切片(線形変換の加算値)
column_num 変換対象の列番号(1始まり)
precision 出力する小数点以下の桁数
input_csv_file 入力CSVファイルのパス
na_replacement 欠損値・非数値の置換文字列または"keep"(省略時は"keep")
Description:
指定したCSVファイルの指定列の値に対して、線形変換 y = a * x + b を適用します。
欠損値や数値でない値は、指定した文字列に置換するか、"keep"指定であればそのまま保持します。
Example:
# 第3列を y=2.5*x + 10 に変換し、小数点2桁で出力。欠損値はそのまま保持。
./linear_convert.sh 2.5 10 3 2 input.csv
# 欠損値を"Missing"に置換する場合
./linear_convert.sh 2.5 10 3 2 input.csv Missing
'
# --- 引数チェック ---
if [ "$#" -lt 5 ] || [ "$#" -gt 6 ]; then
echo "Usage: $0 <a: slope> <b: intercept> <column_num> <precision> <input_csv_file> [na_replacement|keep]"
echo "Example: $0 2.5 10 3 2 input.csv Missing"
echo "na_replacement options: NA, Missing, 0, or keep (default: keep)"
exit 1
fi
# --- 引数を変数に代入 ---
a="$1"
b="$2"
col="$3"
precision="$4"
input_file="$5"
na_replacement="${6:-keep}" # 6番目の引数がなければ keep をデフォルトに
awk -F',' -v a="$a" -v b="$b" -v col="$col" -v prec="$precision" -v na="$na_replacement" '
BEGIN {
OFS = ",";
format = "%." prec "f";
}
NR == 1 {
print $0;
}
NR > 1 {
val = $col;
if (val ~ /^[0-9.]+$/) {
$col = sprintf(format, a * val + b);
} else {
if (na == "keep") {
$col = val; # 欠損・非数値はそのまま保持
} else {
$col = na; # na_replacement で置換
}
}
print $0;
}
' "$input_file"