shuf file --output file: in-place shuffling

PATTERNS=(dummy pattern1 pattern2 ... pattern14) ; dummy to occupy index zero
for file in /path/to/my/files/*
do
  for p in 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  printf ${file}"\t"
  do
    c=$(grep -c PATTERNS[${p}] ${file}) # depending on the nature of your pattern you may need quotes around it
    printf ${c}"\t"
  done
  echo
done

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

4
06.12.2016, 20:12
2 ответа

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

#!/bin/bash
scratch=$(mktemp)
trap 'rm -f "$scratch"' EXIT
if [[ -r "$1" ]]; then
    shuf "$1" --output "$scratch" && mv "$scratch" "$1"
fi

Приведенный выше сценарий можно сохранить как e. грамм. shuf_in_place в вашем ПУТИ .

1
27.01.2020, 20:50

Да - согласно документации - перетасовка файла на месте должна быть безопасной:

-o output-file
- output = output-file
Записать вывод в файл вывода вместо стандартного вывода. shuf считывает весь ввод перед открытием файла вывода , поэтому вы можете безопасно перетасовать файл на месте, используя такие команды, как shuf -o F и кот F | shuf -o F .

9
27.01.2020, 20:50

Теги

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