команда сортировки не подходит для большого файла - PullRequest
0 голосов
/ 07 января 2019

У меня есть текстовый файл со списком имен умений (около 150 миллионов строк). Я отсортировал это с помощью команды

sort myFile.txt >> SortedFile.txt 

Чтобы проверить результат этой команды, я выполнил команду

grep -n "^JavaScript$" SortedFile.txt >> lineNumbers.txt 

Я видел, что JavaScript встречается в двух группах. Одна группа из 27819903 - 28071139, а другая из 99390179 - 99607141.

Эта проблема не только со скиллом «JavaScript», она возникает для многих навыков. В чем проблема с командой сортировки?

Как правильно отсортировать myFile с помощью команды сортировки?

1 Ответ

0 голосов
/ 07 января 2019

Немного трудно сказать без тестовых данных (a) , но, поскольку он состоит из двух разделов, мое первое предложение должно быть изменено:

sort myFile.txt >> SortedFile.txt

до:

sort myFile.txt > SortedFile.txt

Первый из них просто добавляет результаты к файлу, который может уже существовать, поэтому, если вы сделаете это дважды, вы получите два разрозненных раздела. То же самое для команды grep, которую вы используете для обнаружения номеров строк.

Я бы ожидал, что если бы вы использовали один и тот же источник, вы бы получили два блока одинакового размера (что здесь не так), но я понятия не имею, что файл содержит до Вы добавили к нему.

Итак, попробуйте без добавления и посмотрите, есть ли у вас такая же проблема.


Другая вещь, которую я хотел бы задать себе: почему вы сортируете это? Мне кажется (хотя раньше я ошибался, просто попросите мою жену составить полный список), что единственным возможным вариантом использования здесь является подсчет количества каждого навыка. Мне трудно предусмотреть любую другую возможность, но, если у вас есть такая возможность, пожалуйста, сообщите нам, что может быть такой же лучший способ сделать это для другого варианта использования.

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

awk '{count[$1]++}END{for(key in count){print key" "count[key]}}'

См. Следующую команду в качестве примера:

pax> ( echo JavaScript; echo C; echo Java; echo JavaScript ) | awk '
...>    {count[$1]++}END{for(key in count){print key" "count[key]}}'

Создает:

C 1
Java 1
JavaScript 2

(a) И три с лишним гига, вероятно, слишком много тестовых данных для публикации: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...