Применение одной и той же команды sed к нескольким текстовым файлам

Программы потребляют всю память и мощность ЦП, которые они могут получить, если они не имеют встроенных -ограничений. unzipне имеет таких встроенных -ограничений. Вы можете дать ему меньше, но вы не можете дать ему больше, потому что по умолчанию ему разрешено брать столько, сколько он хочет.

Распаковка не требует -интенсивного использования памяти. Основные затраты памяти на распаковку огромного архива заключаются в том, что unzip сохраняет список файлов в памяти.

Ограничивающим фактором для скорости может быть мощность процессора или диска (или сеть, если вы читаете или записываете файл в сеть ). Это зависит от того, насколько быстро ваш диск относительно вашего процессора. Проверьте, использует ли процесс 100% одного ядра. Если это не так, то единственный способ ускорить это - ускорить ввод/вывод. Это может означать более быстрый диск или размещение ввода и вывода на отдельных дисках.

Если процесс занимает 100% одного ядра, то можно ускорить его за счет распараллеливания. Для многих форматов сжатия декомпрессия одного файла по своей природе -не может быть распараллелена, поскольку формат является очень адаптивным :сжатие достигается путем поиска повторяющихся шаблонов и замены их некоторой косвенной ссылкой на предыдущий шаблон.Некоторые форматы сжатия имеют «точки повторной инициализации», которые позволяют распаковывать каждый блок независимо; Я знаю, что это как минимум относится к bzip2. Некоторые инструменты сжатия делают это, даже если формат этого не требует. Но, насколько я знаю, это не относится к zip. С другой стороны, zip сжимает каждый член архива отдельно, поэтому можно распаковывать каждый файл независимо. Таким образом, если у вас n ядер, вы можете занять их все распаковкой отдельных файлов (, если ваш ввод-вывод работает на должной скорости ).

Проблема заключается в том, чтобы найти параллельную реализацию распаковки. Я думаю, что p7zip поддерживает его с 7z x -mmt=on foo.zipили7z x -mmt=8(для использования 8 ядер ), но документация p7zip не очень хороша, и я не подтвердил, что это действительно распараллеливается.

1
08.10.2021, 06:43
3 ответа

Для записи в разные файлы из одной и той же команды 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.

Конечно, это не подходит для большого количества файлов.

0
08.10.2021, 09:25

-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в зависимости от дистрибутива)

0
08.10.2021, 10:56

Предположим, вы хотите отредактировать оба файла и перенаправить вывод в каталог 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
0
09.10.2021, 18:03

Теги

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