сортировка по нескольким файлам в Linux

у меня есть несколько (много) файлов; каждый очень большие:

file0.txt
file1.txt
file2.txt

Я не хочу объединять их в один файл, потому что результирующий файл будет 10+ Gigs. Каждая строка в каждом файле содержит 40-байтовую строку. Строки довольно хорошо упорядочены прямо сейчас (около 1: 10 шагов-это уменьшение значения вместо увеличения).

Я бы заказал линий. (на месте, если возможно?) Это означает, что некоторые строки из конца file0.txt будет перемещен в начало file1.txt и наоборот.

Я работаю над Linux и довольно новичок в нем. Я знаю о sort команда для одного файла, но мне интересно, есть ли способ сортировки по нескольким файлам. Или, может быть, есть способ сделать псевдо-файл из небольших файлов, которые linux будет рассматривать как один файл.

то, что я знаю, может сделать: Я могу каждый файл по отдельности и читать в file1.txt чтобы найти значение больше, чем наибольшее в file0.txt (аналогично возьмите строки с конца file0.txt), чтобы присоединиться и затем сортировать.. но это боль и не предполагает никаких значений от file2.txt принадлежит file0.txt (однако весьма маловероятно в моем случае)

редактировать

чтобы быть ясным, если файлы выглядят следующим образом:

f0.txt
DDD
XXX
AAA

f1.txt
BBB
FFF
CCC

f2.txt
EEE
YYY
ZZZ

Я хочу этого:

f0.txt
AAA
BBB
CCC

f1.txt
DDD
EEE
FFF

f2.txt
XXX
YYY
ZZZ

5 ответов


Я не знаю о команде, выполняющей сортировку на месте, но я думаю, что более быстрая "сортировка слияния"возможна:

for file in *.txt; do
    sort -o $file $file
done
sort -m *.txt | split -d -l 1000000 - output
  • на sort в цикле for убедитесь, что содержимое входных файлов Отсортировано. Если вы не хотите перезаписывать оригинал, просто измените значение после

Это не совсем то, что вы просили, но sort(1) утилита может помочь, немного, с помощью . Сортируйте каждый файл по отдельности, затем сортируйте полученную кучу файлов:

for f in file*.txt ; do sort -o $f < $f ; done
sort --merge file*.txt | split -l 100000 - sorted_file

(Это 100 000 строк в выходной файл. Возможно, это все еще слишком мало.)


Я считаю, что это ваш лучший выбор, используя утилиты Linux:

  • вроде каждый файл по отдельности, например,for f in file*.txt; do sort $f > sorted_$f.txt; done

  • вроде все sort -m sorted_file*.txt | split -d -l <lines> - <prefix>, где <lines> - это количество строк в файле, и <prefix> - это префикс. (The -d говорит split использовать числовые суффиксы).

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


mmap () 3 файла, так как все строки имеют длину 40 байт, вы можете легко отсортировать их на месте (SIP: -). Не забудьте msync в конце.


если файлы сортируются по отдельности, то вы можете использовать sort -m file*.txt чтобы объединить их вместе-прочитайте первую строку каждого файла, выведите наименьший и повторите.