Вы хотите сначала извлечь 36-строчный заголовок из файла с именем input
, затем выбрать 60000 случайных строк из остальной части файла с возможностью случайного выбора одной и той же строки несколько раз. Весь вывод должен идти в файл с именем output
.
Использование shuf
из GNU coreutils:
#!/bin/sh
# Fetch header (36 first lines)
head -n 36 <input >output
# Scramble the other lines and pick 60000 (allowing for repeated lines)
tail -n +37 <input | shuf -r -n 60000 >>output
В качестве альтернативы:
( head -n 36 <input; tail -n +37 <input | shuf -r -n 60000 ) >output
С GNU head
, который оставляет поток входного файла в позиции после последней выведенной строки, что означает, что shuf
может продолжаться там, где head
закончил чтение (это может не работать с некоторыми не -реализации GNU head
):
( head -n 36; shuf -r -n 60000 ) <input >output
@steedriver обнаружил проблему :В Windows в конце строки есть escape-символы, которых нет в Linux. Я создал входной текстовый файл ab.txt в Windows, поэтому Linux считывает лишние символы в переменные a, b. Мое решение состояло в том, чтобы преобразовать ab.text с помощью dos2unix, и это сработало.