
以下は私のコードです。
#!/usr/bin/ksh
awk 'BEGIN {FS="|"; flag=0;}
{
x=$2
rem=int(x)%62
quo=int(x/62)
flag=0
while(quo>62)
{
sub_rem=int(quo)%62
quo=int(quo/62)
if(flag==0)
{
grp_rem=sub_rem
}
else
{
grp_rem=sub_rem","grp_rem
}
flag++
}
printf "%d|%d|%s,%s,%s\n",$1,$2,quo,grp_rem,rem >> "text.out"
}
end{}
' test.txt
上記のコードの問題は次のとおりです。
1)18個以上の入力を渡そうとするときはデフォルト値を使用します。
Sample data:
1|123456789123456789123456789
2|24536789215457896314563
2)一部の行でbase62操作を実行した後、他の行の出力が異なります。
sample data:
row1: 1|276
row2: 1|276
row3: 1|277
row4: 1|278
.
.
.
.
row 300: 300|276
samplet out:
row1: 1|276|4,0,28
row1: 1|276|4,0,28
row1: 1|277|4,0,27
row1: 1|278|4,0,28
...
row 300: 300|276|4,1,28
上記の問題を解決する方法はありますか?
答え1
整数精度を達成していますawk
。
入力ファイルが与えられたら:
$ cat file
1|123456789123456789123456789
2|24536789215457896314563
簡単な方法では、print
正しい結果は表示されません。
$ awk -F\| '{print $2+0}' file
123456789123456791337762816
24536789215457895776256
今後の方法はオプションを使用すること--bignum
です-M
。
$ awk --bignum -F\| '{print $2+0}' file
123456789123456789123456789
24536789215457896314563
このオプションは--bignum
GNU awk バージョン 4.1.0 から利用できます。