Разделите файл с методической точностью и управляйте получающимся расширением файлов

Единственный стандартный способ сделать это должно удалить разрешение записи из каталога. Это будет, конечно, препятствовать тому, чтобы что-либо создало файлы в этом каталоге.

28
26.02.2012, 01:09
3 ответа

Не с split, но можно легко переименовать их впоследствии, или можно выполнить в нем awk:

awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile
12
27.01.2020, 19:38
  • 1
    Хорошие Взгляды - но не работают. В Вашей форме, жалуется на "выражение для'>>' перенаправление, имеет значение пустой строки", и если "файл" "изменяется" на "имя файла", выходные файлы формы wrd. {Номер документа}. {Строка number}.txt (довольно многие из них :) –  Rogach 25.02.2012, 07:15
  • 2
    @Rogach Извините, я не протестировал его, таким образом, я забыл, что awk не делает целочисленного деления. Я протестировал этого. –  Kevin 25.02.2012, 08:07

Такими задачами лучше всего управляют с оболочкой. Используйте разделение и затем запишите простой цикл для переименования файлов. Например.

for file in wrd.*
do
    mv "$file" "$file.txt"
done

переименовал бы Ваш wrd.01, wrd.02, и т.д. файлы, таким образом, у них всех есть .txt расширение.

14
27.01.2020, 19:38
  • 1
    Это довольно очевидно, но это повредило бы краткость сценария удара. –  Rogach 25.02.2012, 07:08
  • 2
    философия Unix должна предоставить Вам ряд простых инструментов, которые Вы затем комбинируете, чтобы сделать задание. "Краткость сценария удара" не была установленным требованием в Вашем вопросе. –  Kyle Jones 25.02.2012, 07:19
  • 3
    PS: split+mv комбинация - больше это в 6 раз быстрее, чем awk (приблизительно 3 с по сравнению с 18), поскольку 10 миллионов строк ввели файл (75 МБ)... текст в каждой строке был своим собственным номером строки... Спасибо за повторное заявление об "очевидном" :) –  Peter.O 25.02.2012, 12:36
  • 4
    PPS: я просто проверял это немного далее. Различие в скорости связано с количеством файлов, созданных по сравнению с количеством форматирования, и арифметические вычисления awk делает для каждой строки независимо от количества выходных файлов... Используя тот же входной файл как вышеупомянутый пример: Когда существует 100 раз меньше файлов, split + mv в 75 раз быстрее, чем awk: Когда существует в 100 раз больше файлов, split + mv в 1.5 раза быстрее, чем awk. Так, для меня, этого split + mv победы метода, передает. Это как consice (возможно moreso) и быстрее, чем awk. –  Peter.O 25.02.2012, 17:59
  • 5
    , если Вы обеспокоены этим являющийся 5 строками долго, пробует это вместо этого: for file in wrd.*; do mv "$file" "$file.txt"; done "Портативный" :) –  Tony 28.10.2015, 06:20

Это не было доступно тогда, но с более поздними версиями (≥ 8.16) из gnu split можно использовать --additional-suffix переключатель для управления получающимся расширением. От man split:

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.

таким образом, при использовании той опции:

split -dl 10000 --additional-suffix=.txt words wrd

получающиеся части автоматически закончатся в .txt:

wrd00.txt
wrd01.txt
.........
50
27.01.2020, 19:38
  • 1
    Не работая над Примечанием mac –  ericgu 10.02.2015, 06:51
  • 2
    я люблю Ваш сарказм. Я - unix n00b от мира Apple. Я использую OS X Йосемити, и я просто не хотел, чтобы другие отказали, и гореть как я сделал. Я протестировал и рассмотрел в документах, и у нас нет этого параметра. Я, возможно, пропустил что-то. developer.apple.com/library/mac/documentation/Darwin/Reference / … –  ericgu 10.02.2015, 17:46
  • 3
    @swiftshokunin - мой ответ принадлежит gnu split, часть gnu coreutils. Это также доступно на OSX, если Вы устанавливаете coreutils через homebrew но обратите внимание что по умолчанию, на OSX, gnu утилиты имеют a g предварительно ожидаемый к их имени (например. gstat вместо stat) таким образом, Вы вызываете его как gsplit (или измените ПУТЬ согласно руководству здесь, если Вы хотите использовать его как split по OSX split). HTH. –  don_crissti 10.02.2015, 18:50
  • 4
    Хороший ответ. на OS X использовать gsplit заставить числовые суффиксы (-d) работать. –  Brent Faust 24.07.2015, 04:02
  • 5
    , ничего себе, я понятия не имел, что существует gsplit - это, вероятно, от упомянутого выше coreutils, и он действительно имеет - дополнительный суффикс. Благодаря всем комментирующим это решение :) –  Łukasz Rysiak 31.05.2016, 13:15

Теги

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