awk変数は、forループ内でsubstr()が返した文字「z」に関連付けることはできません。

awk変数は、forループ内でsubstr()が返した文字「z」に関連付けることはできません。

キーを使用して各文字の暗号化された文字セットを生成すると、その文字が変数に追加されないようにz見えます。コードに問題がありますか?ご指摘ください。

zforループに追加の文字を追加してカウンタを増やそうとしましたが、z文字列にリンクされていません。

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
    }
}

出力

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

ベストアンサー1

モジュロ演算子を正しく使用していません。

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"

Yourはz文字列の62番目の文字ですcharset。オフセットモジュロ62を計算しています。これは、結果の値が0次の範囲にある可能性があることを意味します61awkの文字列オフセットが必要なので、1やるべきことは結果の値に加えてオフセットが..範囲内にあるように1計算することです。162

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

おすすめ記事