Программы потребляют всю память и мощность ЦП, которые они могут получить, если они не имеют встроенных -ограничений. unzip
не имеет таких встроенных -ограничений. Вы можете дать ему меньше, но вы не можете дать ему больше, потому что по умолчанию ему разрешено брать столько, сколько он хочет.
Распаковка не требует -интенсивного использования памяти. Основные затраты памяти на распаковку огромного архива заключаются в том, что unzip сохраняет список файлов в памяти.
Ограничивающим фактором для скорости может быть мощность процессора или диска (или сеть, если вы читаете или записываете файл в сеть ). Это зависит от того, насколько быстро ваш диск относительно вашего процессора. Проверьте, использует ли процесс 100% одного ядра. Если это не так, то единственный способ ускорить это - ускорить ввод/вывод. Это может означать более быстрый диск или размещение ввода и вывода на отдельных дисках.
Если процесс занимает 100% одного ядра, то можно ускорить его за счет распараллеливания. Для многих форматов сжатия декомпрессия одного файла по своей природе -не может быть распараллелена, поскольку формат является очень адаптивным :сжатие достигается путем поиска повторяющихся шаблонов и замены их некоторой косвенной ссылкой на предыдущий шаблон.Некоторые форматы сжатия имеют «точки повторной инициализации», которые позволяют распаковывать каждый блок независимо; Я знаю, что это как минимум относится к bzip2. Некоторые инструменты сжатия делают это, даже если формат этого не требует. Но, насколько я знаю, это не относится к zip. С другой стороны, zip сжимает каждый член архива отдельно, поэтому можно распаковывать каждый файл независимо. Таким образом, если у вас n ядер, вы можете занять их все распаковкой отдельных файлов (, если ваш ввод-вывод работает на должной скорости ).
Проблема заключается в том, чтобы найти параллельную реализацию распаковки. Я думаю, что p7zip поддерживает его с 7z x -mmt=on foo.zip
или7z x -mmt=8
(для использования 8 ядер ), но документация p7zip не очень хороша, и я не подтвердил, что это действительно распараллеливается.
Для записи в разные файлы из одной и той же команды sed
вы можете использовать либо команду w
, либо флаг w
команды s
.
В вашем случае кажется, что последнее поле строки — это поле класса, определяющее, в какой файл оно должно быть записано, поэтому нам вообще не нужно заботиться о том, какой файл является исходным. Нам даже не нужно заботиться о первых двух строках, потому что их можно игнорировать, потому что у них нет допустимого класса:
sed -ne 's/"//g;/,8$/woutput/Class_8.txt' -e '/,9$/woutput/Class_9.txt' file*
Таким образом, для всех строк вы удаляете двойные кавычки с помощью s/"//g
, затем /,8$/
выбирает все строки с 8
в последнем поле, и они должны быть w
заменены на output/Class_8.txt
. То же самое для класса 9. Вывод по умолчанию подавляется опцией -n
.
Конечно, это не подходит для большого количества файлов.
-i.suf
в sed
добавляет .suf
к старым файлам и записывает изменения в новые. Таким образом, вы можете 1 )использовать sed
для изменения файлов и оставить старые с суффиксом, 2 )переместить новые файлы и 3 )переименовать старые в исходное имя, удалив суффикс:
sed -i.bup '1,2d;s/"//g' file1.txt file2.txt file3.txt
mv file{1..3}.txt output
rename 's/.bup$//' file{1..3}.txt.bup
(rename
иногда также называют prename
или perl-rename
в зависимости от дистрибутива)
Предположим, вы хотите отредактировать оба файла и перенаправить вывод в каталог output
с теми же именами файлов, но с отредактированной версией, тогда этот awk
может работать.
$ awk 'FNR > 1 { gsub(/\"/,""); print > "output/"FILENAME ; next } FNR > 1 { gsub(/\"/,""); print > "output/"FILENAME }' Class_8.txt Class_9.txt
Или как скрипт
$ cat awk.script
FNR > 1 { #Remove line 1 from first file
gsub(/\"/,"") #Substitute all double quotes for nothing
print > "output/"FILENAME #Send the output to new directory with the same filename
next #Move on to the next file
} FNR > 1 { #Remove line 1 from second file
gsub(/\"/,"") #Substitute all double quotes for nothing
print > "output/"FILENAME #Send the output to new directory with the same filename
}
Чтобы использовать скрипт с вашими файлами, вы можете запустить команду как
$ awk -f awk.script Class_8.txt Class_9.txt
Вывод будет следующим
$ cat output/Class_8.txt
Total Students:,247
John,14,8
Sara,13,8
$ cat output/Class_9.txt
Total Students:,119
John,15,9
Sara,16,9