簡體   English   中英

Linux中的高價值變量

[英]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

使用Awk

以此作為示例輸入:

$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM