У меня есть 100 000 файлов, которые я хотел бы проанализировать. В частности, я хотел бы рассчитать процент печатаемых символов из образца файла произвольного размера. Некоторые из этих файлов относятся к мэйнфреймам, Windows, Unix и т. Д., Поэтому вполне вероятно, что включены двоичные и управляющие символы.PERL для подсчета непечатаемых символов
Я начал с использования команды «файл» Linux, но для моих целей он не предоставил достаточно деталей. Следующий код передает то, что я пытаюсь сделать, но не всегда работает.
#!/usr/bin/perl -n
use strict;
use warnings;
my $cnt_n_print = 0;
my $cnt_print = 0;
my $cnt_total = 0;
my $prc_print = 0;
#Count the number of non-printable characters
while ($_ =~ m/[^[:print:]]/g) {$cnt_n_print++};
#Count the number of printable characters
while ($_ =~ m/[[:print:]]/g) {$cnt_print++};
$cnt_total = $cnt_n_print + $cnt_print;
$prc_print = $cnt_print/$cnt_total;
#Print the # total number of bytes read followed by the % printable
print "$cnt_total|$prc_print\n"
Это тестовый вызов, который работает:
echo "test_string of characters" | /home/user/scripts/prl/s16_count_chars.pl
Это, как я собираюсь назвать его, и работает для одного файла:
find /fct/inbound/trans/ -name "TRNST.20121115231358.xf2" -type f -print0 | xargs -0 head -c 2000 | /home/user/scripts/prl/s16_count_chars.pl
Это не работает правильно:
find /fct/inbound/trans/ -type f -print0 | xargs -0 head -c 2000 | /home/user/scripts/prl/s16_count_chars.pl
Ничего из этого:
find /fct/inbound/trans/ -type f -print0 | xargs -0 head -c 2000 | perl -0 /home/user/scripts/prl/s16_count_chars.pl
Вместо выполнения сценария один раз для строки EACH, возвращаемой поиском, он выполняет ВСЕ ДЛЯ ВСЕХ результатов.
Заранее спасибо.
исследований до сих пор:
Трубы и XARGS и сепараторы
http://help.lockergnome.com/linux/help-understand-pipe-xargs--ftopict549399.html
http://en.wikipedia.org/wiki/Xargs#The_separator_problem
Осветление (ы):
1.) Желаемый результат: если в каталоге имеется 932 файла, выход будет состоять из 932 строк списка имен файлов, общее количество байтов, считанных из файла, и%, которые были печатаемыми символами.
2.) Многие из файлов являются двоичными. Сценарий должен обрабатывать встроенные двоичные файлы eol
или eof
последовательностей.
3.) Многие из файлов большие, поэтому я хотел бы только прочитать первые/последние байты xx. Я пытался использовать head -c 256
или tail -c 128
для чтения первых 256 байтов или последних 128 байтов соответственно. Решение может либо работать в линии трубопровода, либо ограничивать байты в perl-скрипте.
'в то время как ($ _ = ~ м/[^ [: печать:]]/г) {$ cnt_n_print ++};' лучше сделано как '$ cnt_n_print + = (() = m/[^ [: print:]]/g); '(или еще лучше, используя tr ///, только тот, который не поддерживает классы POSIX) – ysth
« Лучше »= быстрее, более сжато, но использует больше памяти. На самом деле, возможно, намного больше. (Целый строковый скаляр для соответствующего символа!) – ikegami
Noooo! Не '-n' на линии shebang! – Borodin