Как случайным образом разделить файл, а затем выбрать те же номера строк из нескольких файлов

Имеете ли вы правильные разрешения на папку/файл .ssh и .ssh/authorized_keys? В зависимости от конфигурации вашего SSH-сервера могут потребоваться строгие разрешения. Также убедитесь, что права собственности указаны правильно.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
1
02.03.2017, 20:59
3 ответа

Вы можете сначала извлечь 100 случайных чисел из 3494, а затем извлечь эти номера строк из каждого файла, например,

seq 3494 | shuf -n 100 | awk 'NR==FNR{ z[$0]++;next}
{if (FNR in z){ print >FILENAME"_random"}}' - ./*.txt

Это извлечет одинаковые номера строк из каждого файла и сохранит их в FILENAME"_random"

1
27.01.2020, 23:46

Вы можете создать простой файл сценария sed для печати строк по определенным индексам, например

printf '%dp\n' $(shuf -i 1-3494 -n 100) > indexfile

, затем используйте его как

sed -nf indexfile File1
sed -nf indexfile File2
.
.

и так далее. Если у вас есть GNU sed с -s, --separate , вы можете выбрать одни и те же строки из нескольких файлов последовательно, используя

sed -snf indexfile File1 File2 File3

(замените File1 File2 File3 с шариком из ракушки, если хотите).

Если вам нужен однострочник, который выбирает разные случайные подмножества при каждом вызове, вы можете сделать что-то вроде

printf '%dp\n' $(shuf -i 1-3494 -n 100) | sed -snf - File1 File2 File3
1
27.01.2020, 23:46
perl -ls0777ne 'print for(split $\)[split $\,$r]' -- -r="$(shuf -i 0-3493 -n 100)" -- ./*.txt

r="$(shuf -i 0-3493 -n 5)" \
perl -l -0777ne 'print for(split $\)[split $\,$ENV{r}]' ./*.txt

Случайная комбинация генерируется и передается в Perl через командную строку, что гарантирует, что все файлы получат одинаковую случайную последовательность. Каждый файл slurped затем разделяется на newline и выбирается за один раз с помощью конструкции @A[...]. Обратите внимание, что поскольку индексы Perl начинаются с нуля, команда shuf получает 0..3494-1

0
27.01.2020, 23:46

Теги

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