Awk programs consist of pattern {action} pairs, where {action} is performed if pattern evaluates TRUE. If pattern is omitted, it is assumed TRUE by default, while if {action} is omitted, the default action is {print}.
In
awk 'FS=","; OFS=","; {print $2, $3}' A.tsv
you have:
pattern
FS=","which assigns,as the value ofFS, and as a side effect evaluates TRUE, triggering the default action{print}pattern
OFS=","likewise assigns,toOFS, evaluates TRUE and triggers the default{print}action a second timeaction
{print $2,$3}with no pattern, so the default TRUE is assumed and the action is triggered. HoweverFSwas not set to,until the first record had already been processed, so$2and$3are both empty (since awk used the default whitespaceFSto parse the first record, assigning the whole record to$1). On subsequent records, it prints the expected comma-delimited values.
You probably intended to assign FS="," and OFS="," in an action before record processing begins - that's the function of a BEGIN block:
awk 'BEGIN{FS=","; OFS=","} {print $2, $3}' A.tsv
or
awk -F ',' ''BEGIN{OFS=FS} {print $2, $3}' A.tsv
Alternatively, you can pass variable assignments as arguments before the filename argument(s) (this is sometimes useful if you are processing multiple files and want to set different field separators for each)
awk '{print $2, $3}' FS="," OFS="," A.tsv