сортировка файла с помощью команды сортировки и перезапись

Не проблема, используя ntfs3g в течение 4 лет, и единственные проблемы в моих разделах ntfs были вызваны окнами Microsoft.

Я даже использовал его с USB-накопителями (да, мои USB-диски находятся в NTFS, потому что это единственный способ поделиться фильмами с пользователями Windows Microsoft ...), и он отлично работает.

1
задан 13 April 2015 в 23:01

2 ответа

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

В общем случае (т.е. при перенаправлении вывода команды к его входному файлу, так как эта проблема происходит не только с sort), вы можете выполнить требуемую команду в подоболочке и сохранить ее вывод в переменной, а затем очистить содержимое переменной до файла (например, с помощью [ f4]), таким образом задерживая усечение файла ввода / вывода в точку, где уже был прочитан входной файл:

tmp=$(sort test) && echo "$tmp" >  test

Также обратите внимание, что это не очень эффективно для больших файлов и что вместо ; вместо ; был выбран оператор &&, чтобы избежать усечения файла ввода / вывода в случае отказа первой команды.

0
ответ дан 23 May 2018 в 21:25
  • 1
    hey @kos это не сработало, сделал файл пустым ... – favarjooy86 13 April 2015 в 23:32
  • 2
    Вероятно, вы забудете ; или && i.e. tmp=$(sort test); echo "$tmp" > test .. также обратите внимание, что это не эффективно в случае большого файла. – heemayl 13 April 2015 в 23:35
  • 3
    @heemayl Конечно, спасибо – kos 13 April 2015 в 23:38
  • 4
    @ favarjooy86 Я забыл оператор &&, чтобы связать команды, теперь он исправлен – kos 13 April 2015 в 23:39
  • 5
    @ knh190 Это усекает файл на первом месте, потому что echo не читает из stdin, поэтому даже что-то вроде echo "string" | echo > test.txt создаст пустой файл. Но даже sort test.txt | tee > test.txt будет страдать от одной и той же проблемы, потому что в той же команде файл всегда будет усечен до того, как он будет прочитан, несмотря на порядок команд внутри канала, так как bash работает. Таким образом, единственный способ - либо явно продвинуть чтение, либо явно задержать запись. – kos 14 April 2015 в 10:46

Вы можете написать как sort -b -o имя файла filename, где filename указывает тот же файл в два раза, как вы хотите, чтобы результат был сохранен или перезаписан в исходный файл. Эта команда работает как, она должна удалить все пробелы и сортировать содержимое файла и переписать в исходный файл.

Затем вы можете распечатать содержимое файла, указав sort -b -o filename filename , чтобы распечатать содержимое файла как вывод на стандартном устройстве вывода.

Спасибо.

-1
ответ дан 23 May 2018 в 21:25
  • 1
    Как ваш ответ отличается от принятого ответа? – user68186 30 October 2017 в 19:18
  • 2
    Ну, я попытался рассказать о том, как использовать опцию -o и где идеально разместить при записи. Также попытался указать важность обработки пустых пространств, которые иногда могут приводить к неправильному порядку сортировки, показывая использование -b. Надеюсь, поможет. благодаря – ShrutiM 30 October 2017 в 19:32

Другие вопросы по тегам:

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