Это потому, что вы меняете $ NF на 2, что делает второе условие верным, и оно снова возвращается к 1. Вам нужен else
.
awk -vFS="" '{if($NF==1) {gsub($NF,2) }else if($NF==2)gsub($NF,1)}1'
Я могу придумать немного более простое решение в sed:
sed 's/1$/2/;t;s/2$/1/'
, которая использует команду t
, которая (если метка не указана) переходит в конец сценария, если предыдущая замена прошла успешно.
Другое возможное решение использует Perl:
perl -pe 's/([12])$/ $1 =~ tr=12=21=r /e'
Который соответствует последним 1 или 2 и выполняет транслитерацию для него. Вы можете использовать аналогичный трюк с tr
в оболочке:
printf '%s' ${string:0:-1}
printf '%s\n' ${string: -1} | tr 12 21
Без выделения вы можете использовать, например, расширение параметров и арифметику:
if [[ $string = *[12] ]] ; then
echo ${string%[12]}$((3-${string: -1}))
else
echo $string
fi