J'essaie de retourner le dernier caractère de la chaîne entre 1 et 2. J'ai besoin de comprendre pourquoi Aussi, y a-t-il une manière plus intelligente de faire ce retour? P> P> P > System2 code> est capable de convertir en
System1 code>, cependant
System1 code> n'est pas capable de convertir en
System2 code>?
4 Réponses :
C'est parce que vous modifiez la NF $ en 2 qui rend la deuxième condition vraie et elle est de nouveau remplie à 1. Vous avez besoin d'un Je peux penser à une solution de peu plus simple dans SED: p> lequel Utilise la commande Une autre solution possible utilise Perl: P> sinon code>.
t code> que (si aucune étiquette n'a été spécifiée) passe à la fin du script si la substitution précédente a réussi. p>
if [[ $string = *[12] ]] ; then
echo ${string%[12]}$((3-${string: -1}))
else
echo $string
fi
Ce script Awk est un mauvais. Pour un démarrage, il s'appuie sur la réglage FS sur NULL fractionnez la chaîne en caractère mais qui est indéfini Bahavior par Posix, de sorte que cela fera des choses différentes dans différentes horaires. Ensuite, si elle divise l'entrée en caractères, il va remplacer chaque occurrence b> du dernier caractère sur toute la ligne avec 1 ou 2.
Vous pouvez essayer de suivre (la correction de la tentative de OP).
echo system1 | awk ' { val=substr($0,length($0)) printf("%s%s\n",substr($0,1,length($0)-1),val==1+0?2:(val==2?1:val)) val="" }'
La première solution ne fonctionne pas pour les deux intrants (il a le même problème, mais pour l'autre entrée).
@CHOROBA, merci monsieur pour avoir laissé savoir, a changé maintenant.
awk 'BEGIN{FS=OFS=""}($NF==1||$NF==2){$NF=$NF%2+1}1' This is similar to oguzismail's approach. Only alters if last char is 1 or 2. 1 % 2 + 1 = 2, and 2 % 2 + 1 = 1.
Pour ce faire de manière concise, robuste et de manière robuste et avec n'importe quel AWK serait:
$ echo system2| awk '!sub(/1$/,2){sub(/2$/,1)}1' system1 $ echo system1| awk '!sub(/1$/,2){sub(/2$/,1)}1' system2
Pourquoi auriez-vous besoin
awk code> pour cela? Les coquillages intégrés peuvent être utilisés très bien pour cela
Vous avez beaucoup de réponses AWK qui s'appuient sur la réglage FS sur NULL divisent l'entrée en caractères. C'est un comportement indéfini par POSIX et cela fera donc cela dans certains Awks tandis que dans d'autres Awks, cela laissera l'entrée comme une seule ligne dans 1 champ et dans d'autres Awks, il pourrait encore faire autre chose et toujours être conforme à Posix.