как распечатать несколько отдельных для l oop выходов в виде столбцов в bash - PullRequest
0 голосов
/ 04 августа 2020

У меня есть сценарий, в котором я хочу прочитать список двоичных значений и распечатать их следующим образом (в столбцах, но не обязательно с соответствующими обозначениями) -

binary decimal truncated truncated-decimal

et c.

- с последовательным усечением последующих столбцов на все более высокие значения. То, что у меня есть, идет только до 3.

for z in {1..3}; 
    do
    p2=$(for n2 in $(cat binary_primes.txt ); 
            do echo $n2; 
        done)                                   #prints original values
    p10=$(for n10 in $(echo $p2); 
            do echo "ibase=2;$n10;obase=10" | bc; 
        done)                                   #prints original values in decimal
    a2=$(for y in $(cat binary_primes.txt ); 
            do 
            xx=${y:0:${#y}-$z} 2>/dev/null; echo 
            $xx;                                
        done)                                   #original value truncated by 1 bit
    a10=$(for y2 in $(echo $a2); 
            do echo "ibase=2;$y2;obase=10" | bc; 
        done)                                   #the latter in decimal
    b2=$(for x in $(cat binary_primes.txt ); 
            do xx=${x:0:${#x}-$z} 2>/dev/null; 
            echo $xx; 
        done)                                   #original value truncated by 2 bits
    b10=$(for x2 in $(echo $b2); 
            do echo "ibase=2;$x2;obase=10" | bc; 
        done)                                   #the latter in decimal
    c2=$(for w in $(cat binary_primes.txt ); 
            do xx=${w:0:${#w}-$z} 2>/dev/null; 
            echo $xx; 
        done)                                   #original value truncated by 3 bits
    c10=$(for w2 in $(echo $c2); 
            do echo "ibase=2;$w2;obase=10" | bc; 
        done)                                   #the latter in decimal
    echo $p2 $p10 $a2 $a10 $b2 $b10 $c2 $c10;
done

Я пробовал использовать column -t, column -x, paste и join, но все время получаю ошибки. Я бы хотел избежать вывода в кучу текстовых файлов, а затем их чтения - в идеале, сохраняя это самодостаточным.

Мне также интересно, может ли кто-нибудь сказать мне, какой самый чистый способ - просто игнорировать экземпляры значения усечения, превышающего количество битов исходного значения (т. е. усечение 100010101 на значение больше «9», et c). - это то, чего все 2> / dev / null (я знаю, неуклюже) пытаются избежать.

Вот первые 30 строк текстового файла, на который он ссылается, и единственный файл (в идеале) необходимо:

100111101010011111101
100111101010011101001
100111101010011011001
100111101010011000101
100111101010010111111
100111101010010110101
100111101010010101111
100111101010010010001
100111101010001111111
100111101010001100001
100111101010001010101
100111101010001001101
100111101010000101011
100111101010000100011
100111101010000000001
100111101001111111011
100111101001111111001
100111101001111101111
100111101001111101101
100111101001110110011
100111101001110110001
100111101001110100111
100111101001110011111
100111101001110010101
100111101001110001111
100111101001110001101
100111101001101111011
100111101001101110101
100111101001101100011
100111101001101011001

Выходной файл был бы намного длиннее, потому что он печатает, однако многие усечения доступны на основе исходного расширения numeri c, которое в конечном итоге я бы хотел от go до 21 ( самый большой битовый вес в файле), но вот первые 30 строк снова для сравнения:

100111101010011111101  1299709  100111101010011111101  1299709
100111101010011111101  1299709  10011110101001111110   649854
100111101010011111101  1299709  1001111010100111111    324927
100111101010011111101  1299709  100111101010011111     162463
100111101010011111101  1299709  10011110101001111      81231
100111101010011111101  1299709  1001111010100111       40615
100111101010011111101  1299709  100111101010011        20307
100111101010011111101  1299709  10011110101001         10153
100111101010011111101  1299709  1001111010100          5076
100111101010011111101  1299709  100111101010           2538
100111101010011111101  1299709  10011110101            1269
100111101010011111101  1299709  1001111010             634
100111101010011111101  1299709  100111101              317
100111101010011111101  1299709  10011110               158
100111101010011111101  1299709  1001111                79
100111101010011111101  1299709  100111                 39
100111101010011111101  1299709  10011                  19
100111101010011111101  1299709  1001                   9
100111101010011111101  1299709  100                    4
100111101010011111101  1299709  10                     2
100111101010011111101  1299709  1                      1
100111101010011101001  1299689  100111101010011101001  1299689
100111101010011101001  1299689  10011110101001110100   649844
100111101010011101001  1299689  1001111010100111010    324922
100111101010011101001  1299689  100111101010011101     162461
100111101010011101001  1299689  10011110101001110      81230
100111101010011101001  1299689  1001111010100111       40615
100111101010011101001  1299689  100111101010011        20307
100111101010011101001  1299689  10011110101001         10153
100111101010011101001  1299689  1001111010100          5076

В конечном итоге я хочу иметь 5-й столбец, который не будет в стандартном выводе, но будет сгенерирован, пока скрипт запускается на основе факторизации значений в 4-м столбце, а затем grepping / awking, так что никакие усеченные значения, которые также не являются простыми, не будут напечатаны:

1299709: 1299709
649854: 2 3 3 79 457
324927: 3 3 79 457
162463: 7 23209
81231: 3 27077
40615: 5 8123
20307: 3 7 967
10153: 11 13 71
5076: 2 2 3 3 3 47
2538: 2 3 3 3 47
1269: 3 3 3 47
634: 2 317
317: 317
158: 2 79
79: 79
39: 3 13
19: 19
9: 3 3
4: 2 2
2: 2
1:
1299689: 1299689
649844: 2 2 13 12497
324922: 2 13 12497
162461: 13 12497
81230: 2 5 8123
40615: 5 8123
20307: 3 7 967
10153: 11 13 71
5076: 2 2 3 3 3 47

После того, как greped + awked только они являются простыми:

1299709: 1299709
317: 317
79: 79
19: 19
2: 2
1299689: 1299689

Другая проблема, с которой я столкнулся, заключается в том, что я не уверен, как заставить два столбца продолжать печатать одно и то же значение, в то время как другие столбцы увеличиваются.

т.е. это:

100111101010011111101  1299709  100111101010011111101  1299709
100111101010011111101  1299709  100111101              317
100111101010011111101  1299709  1001111                79
100111101010011111101  1299709  10011                  19
100111101010011111101  1299709  10                     2

А не это:

100111101010011111101  1299709  100111101010011111101  1299709
100111101010000101011  1299499  100111101              317
100111101010000000001  1299457  1001111                79
100111101001111111001  1299449  10011                  19
100111101001110110011  1299379  10                     2

Итак, первые 30 строк полного конечного результата того, что я в конечном итоге хочу сделать, это:

100111101010011111101  1299709  100111101010011111101  1299709
100111101010011111101  1299709  100111101              317
100111101010011111101  1299709  1001111                79
100111101010011111101  1299709  10011                  19
100111101010011111101  1299709  10                     2
100111101010011101001  1299689  100111101010011101001  1299689
100111101010011101001  1299689  100111101              317
100111101010011101001  1299689  1001111                79
100111101010011101001  1299689  10011                  19
100111101010011101001  1299689  10                     2
100111101010011011001  1299673  100111101010011011001  1299673
100111101010011011001  1299673  100111101              317
100111101010011011001  1299673  1001111                79
100111101010011011001  1299673  10011                  19
100111101010011011001  1299673  10                     2
100111101010011000101  1299653  100111101010011000101  1299653
100111101010011000101  1299653  100111101              317
100111101010011000101  1299653  1001111                79
100111101010011000101  1299653  10011                  19
100111101010011000101  1299653  10                     2
100111101010010111111  1299647  100111101010010111111  1299647
100111101010010111111  1299647  100111101              317
100111101010010111111  1299647  1001111                79
100111101010010111111  1299647  10011                  19
100111101010010111111  1299647  10                     2
100111101010010110101  1299637  100111101010010110101  1299637
100111101010010110101  1299637  100111101              317
100111101010010110101  1299637  1001111                79
100111101010010110101  1299637  10011                  19
100111101010010110101  1299637  10                     2

1 Ответ

0 голосов
/ 05 августа 2020

Кажется, что требуется читать (двоичные) числа из файла и для каждого значения генерировать несколько строк, показывающих десятичное и двоичное представление (значение, значение / 2, значение / 4, ..., значение / ( 2 ^ n))

Чистое решение - bash, что означает, что оно будет хорошо работать с относительно большими файлами (без повторного вызова утилиты 'b c'). Преобразование двоичного числа в десятичное использует bash арифметические c выражения.

#! /bin/bash

while read b ; do
    # Convert binary 'b' to decimal 'd'
    d=$((2#$b))
    bb=$b
    dd=$d
    b_len=${#b}
    while (( dd > 0 )) ; do
        printf "%s %d %-${b_len}s %d\n" $b $d $bb $dd
        dd=$((dd/2))
        bb=${bb:0:${#bb}-1}
    done
    
done < binary_primes.txt
...