See the comments you received and then try this (untested) as a starting point:
$ cat tst.sh
#!/usr/bin/env bash
tmp_file=$(mktemp) || exit 1
trap 'rm -f "$tmp_file"; exit' EXIT
while getopts n:c:v:i opt; do
case $opt in
n) number="$OPTARG";;
c) column="$OPTARG";;
v) value="$OPTARG";;
i) inplace=1;;
*) printf>&2 '%s\n' "Usage: $0 [-f file] [-n number] [-c column] [-v value]";;
esac
done
shift $((OPTIND-1))
if [[ -z "$column" ]]; then
echo "Please specify a column number with -c." >&2
exit 1
elif [[ -z "$number" ]]; then
echo "Please specify a phone number to filter by via -n" >&2
exit 1
elif [[ -z "$value" ]]; then
echo "Please specify the new value via -v" >&2
exit 1
elif ! (( 1 <= column )) && (( column <= 4 )); then
echo "this script can only handle cols1-4. for group editing, try ./groups.sh" >&2
exit 1
fi
xform() {
awk -v num="^$number" -v col="$column" -v value="$value" \
'BEGIN{FS=OFS=","} $0 ~ num{$col=value} 1' "$@"
}
if [[ -n "$inplace" ]]; then
if (( $# == 0 )); then
echo "cannot do inplace editing as requested by -i without an input file present" >&2
exit 1
fi
all_writeable=1
for file; do
if [[ ! -w "$file" ]]; then
echo "file \"$file\" is not writeable" >&2
all_writeable=0
fi
done
if (( all_writeable == 0 )); then
exit 1
fi
for file; do
xform "$file" > "$tmp_file" &&
mv "$tmp_file" "$file"
done
else
xform "$@"
fi
You should do more validation on the option arguments to ensure, for example, that the values like `column` that you expect to be a natural number truly are natural numbers.