Создать номера 1 -6 в случайном порядке с помощью AWK

Некоторые серверы предоставляют HTTP-доступ к отпечаткам пальцев, например.keys2.kfwebs.net ; это даст вам бронированные ключи, завернутые в простой HTML:

curl 'http://keys2.kfwebs.net/pks/lookup?op=get&search=0xdb221a6900000011'

загрузит всю страницу,

curl 'http://keys2.kfwebs.net/pks/lookup?op=get&search=0xc465beb43c11b337' |
awk '/^-----BEGIN/ { inblock = 1 } /^-----END/ { inblock = 0; print} inblock'

извлечет открытый ключ.

Вы также можете попробовать адаптировать parcimonie , инструмент, который обновляет связки ключей через Tor, чтобы обойти проблему с прокси-сервером.

Имейте в виду, что некоторые ключи были отравлены , так что не стоит слепо импортировать ключи с серверов ключей (, хотя на самом деле это никогда не было ). Также всегда проверяйте полный отпечаток пальца и используйте идентификаторы длинных ключей.

3
06.05.2021, 18:27
3 ответа

Зачем использовать awk, если, по крайней мере, на большинстве Unix-компьютеров вы можете просто:

$ seq 6 | shuf
5
2
3
4
1
6

или как @StéphaneChazelas упомянул в комментарии shuf -i 1-6.

Если вы все же хотите использовать awk, вот один из подходов, использующий Knuth Shuffle:

$ cat tst.awk
function shuf(arr,      i, j, n, tmp) {
    n = length(arr)
    for (i=n; i>1; i--) {
        j = int( 1 + rand()*i )
        tmp = arr[i]
        arr[i] = arr[j]
        arr[j] = tmp
    }
}

BEGIN {
    srand()
    for (i=1; i<=n; i++) { arr[i] = i }
    shuf(arr)
    for (i=1; i<=n; i++) { print arr[i] }
}

$ awk -v n=6 -f tst.awk
3
1
5
4
6
2

который просто заполняет массив нужными вам значениями, затем меняет местами значение, хранящееся в каждом индексе в массиве, со значением, хранящимся в каком-то другом случайно выбранном индексе, а затем печатает массив.

Обратите внимание, что функция shuf()выше работает за один проход массива.

10
28.07.2021, 11:34

Похоже, вы просто хотите перетасовать числа от 1 до 6.

В большинстве реализаций sortесть опция -Rдля сортировки "произвольно" (эта опция не является стандартной ). В большинстве оболочек есть «расширения скобок» для создания комбинаций строк или чисел в диапазонах (раскрытия скобок не являются стандартными):

$ printf '%s\n' {1..6} | sort -R
6
2
3
4
5
1
4
28.07.2021, 11:34

Всего 720 (= 6! (6факториал )= 1×2×3×4×5×6 )различные способы расположения шести разных вещей (включая цифры от 1 до 6 ). Таким образом, один из подходов состоит в том, чтобы сгенерировать случайное число от 1 до 6! (ну, на самом деле, между 0 и 6!−1 )и сопоставьте это с соответствующей перестановкой.

BEGIN {
        n = 6
        srand()
        # Compute n! (n factorial) and create an array of numbers.
        f = 1
        for (i = 1; i <= n; i++) {
                f *= i;
                nums[i] = i;
        }
        # Get random number between 0 and n!-1.
        r = int(rand()*f)
        # Deconstruct it.
        for (i = n; i > 0; i--) {
                remainder = r % i + 1
                print nums[remainder]
                # Remove it from the array.
                for (j = remainder; j < n; j++) nums[j] = nums[j+1]
                r = int(r/i)
        }
}

Это плохо масштабируется.

  • Моя версия awk смогла вычислить 22! но он не смог вычислить 23!
  • Алгоритм O(n2). Это означает, что если бы он обрабатывал большие значения n , n =6000 займет в миллион раз больше, чем n =6.

Преимущества:

  • Возможно, вы захотите использовать это в гипотетическом мире. где rand()очень дорог, потому что он вызывает rand()только один раз.
  • Этот алгоритм упрощает многократно производить один и тот же порядковый номер чисел (, задав rизвестное значение, а не случайное ).
0
28.07.2021, 11:34

Теги

Похожие вопросы