[英]High value variable in Linux
我想讀取一個二進制數字,該數字可以是1到32位之間的任何長度。
示例:1、10、101、10000001 .... 10000000100000001000000010000000
現在,我要做的是計算所有1的出現位置並添加它們。
示例:10001000(8位數字)
通過二進制進行運算,第一個1進入第3位,第二個1進入第7位。
我想要的是最終得到結果10(即7 + 3)
輸入樣例:
10001000
100100
1000000000101
10010000001
100000001
樣本輸出:
10
7
14
17
8
注意:最多可以輸入32位數字。
我的代碼:
while read line
do
count1=0
count2=0
while [ $line -gt 0 ]
do
if (($line % 2 == 0))
then
count2=$(($count2+1))
line=$(($line/10))
else
line=$(($line/10))
count1=$(($count1+$count2))
count2=$(($count2+1))
fi
done
echo $count1
done < h2b.csv >> bit_count.csv
h2b.csv是輸入文件,bit_count是輸出文件。
這適用於較小的值,例如1001、1010、1100,但無法運行大於16位數字的較大值。
當我運行腳本時出現錯誤信息:
line 7: [: 1000000000000000000000: integer expression expected
以此作為示例輸入:
$ cat input
10001000
100100
1000000000101
10010000001
100000001
我們可以用以下方法計算結果:
$ awk -F '' '{x=0; for (i=NF;i>0;i--) if ($i) x+=NF-i; print x}' input
10
7
14
17
8
-F ''
這告訴awk將每個字符視為一個單獨的字段。
x=0
這會將變量x
初始化為零。
for (i=NF;i>0;i--) if ($i) x+=NF-i
這加起來就是總數。
print x
這將打印此行的總數。
此文件中的行長為106個字符:
$ cat >input2
1000100010010010001000100000000100000100000000001000000000000110000000000001100000000000100000000110000001
$ wc input2
1 1 107 input2
$ awk -F '' '{x=0; for (i=NF;i>0;i--) if ($i) x+=NF-i; print x}' input2
1035
具有相同的邏輯:
while read -r line
do
x=0
for ((i=${#line};i>0;i--))
do
[ ${line:$i-1:1} = 1 ] && ((x+=${#line}-i))
done
echo $x
done <input
產生輸出:
10
7
14
17
8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.