La variable awk no puede concatenar la letra "z" devuelta por substr() dentro del bucle for.

La variable awk no puede concatenar la letra "z" devuelta por substr() dentro del bucle for.

Al crear un conjunto de caracteres de cifrado para cada letra usando una clave, la letra zno parece agregarse a la variable. ¿Qué hay de malo en el código? Por favor señale.

Intenté agregar caracteres adicionales después zy aumentar el contador en el bucle for, pero zno se concatena a la cadena.

BEGIN {
    charset="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    printf("Enter your choice:\n1. Encryption.\n2. Decryption.\n")
    getline choice < "-"
    print "Enter Key:"
    getline key < "-"
    for(i=1;i<=62;i++) {
            newch = substr(charset,(i+key)%62,1)
            encharset = encharset newch
            print encharset
    }
}

Producción

Enter your choice:
1. Encryption.
2. Decryption.
1
Enter Key:
19
J
JK
JKL
JKLM
JKLMN
JKLMNO
JKLMNOP
JKLMNOPQ
JKLMNOPQR
JKLMNOPQRS
JKLMNOPQRST
JKLMNOPQRSTU
JKLMNOPQRSTUV
JKLMNOPQRSTUVW
JKLMNOPQRSTUVWX
JKLMNOPQRSTUVWXY
JKLMNOPQRSTUVWXYZ
JKLMNOPQRSTUVWXYZa
JKLMNOPQRSTUVWXYZab
JKLMNOPQRSTUVWXYZabc
JKLMNOPQRSTUVWXYZabcd
JKLMNOPQRSTUVWXYZabcde
JKLMNOPQRSTUVWXYZabcdef
JKLMNOPQRSTUVWXYZabcdefg
JKLMNOPQRSTUVWXYZabcdefgh
JKLMNOPQRSTUVWXYZabcdefghi
JKLMNOPQRSTUVWXYZabcdefghij
JKLMNOPQRSTUVWXYZabcdefghijk
JKLMNOPQRSTUVWXYZabcdefghijkl
JKLMNOPQRSTUVWXYZabcdefghijklm
JKLMNOPQRSTUVWXYZabcdefghijklmn
JKLMNOPQRSTUVWXYZabcdefghijklmno
JKLMNOPQRSTUVWXYZabcdefghijklmnop
JKLMNOPQRSTUVWXYZabcdefghijklmnopq
JKLMNOPQRSTUVWXYZabcdefghijklmnopqr
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrs
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrst
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy   #from this line "z" is not appearing in the string
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy01
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy012
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy01234
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy012345
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy01234567
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy012345678
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789A
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789AB
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789ABC
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789ABCD
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789ABCDE
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789ABCDEF
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789ABCDEFG
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789ABCDEFGH
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789ABCDEFGHI
JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789ABCDEFGHI

Respuesta1

No estás utilizando el operador de módulo correctamente.

echo 0 62  | awk '{ print $1 % $2 }'     # "0"
echo 1 62  | awk '{ print $1 % $2 }'     # "1"
echo 61 62 | awk '{ print $1 % $2 }'     # "61"
echo 62 62 | awk '{ print $1 % $2 }'     # "0" not "62"

Tu zes el carácter 62 de la charsetcadena. Estás calculando compensaciones módulo 62, lo que significa que los valores resultantes pueden estar en el rango 0... 61Dado que awkespera compensaciones de cadena desde 1, lo que debe hacer es agregar 1al valor resultante para calcular el desplazamiento para que esté en el rango 1... 62:

newch = substr(charset, ( (i+key)%62 )+1, 1)

Respuesta2

La substr()función selecciona una subcadena de una cadena. La posición dada como segundo argumento se cuenta desde 1, no desde 0, mientras que el operador de módulo, cuando se usa como %62, le daría números enteros entre 0 y 61.

Esto significa que tendrás que modificar tu llamada substr()para

newch = substr(charset, 1 + ((i + key)%62), 1)

Alternativamente, para evitar constantes mágicas,

newch = substr(charset, 1 + ((i + key)%length(charset)), 1)

información relacionada