передача файлов в unix для "wc" с сохранением имени файла - PullRequest
1 голос
/ 09 декабря 2011

У меня есть куча файлов вида myfile[somenumber], которые находятся во вложенных каталогах.

Я хочу сгенерировать счетчик строк для каждого из файлов и вывести его в файл.

Эти файлы являются двоичными, поэтому их необходимо передать через дополнительный сценарий open_file, прежде чем их можно будет посчитать "wc" Я делаю:

ls ~/mydir/*/*/other_dir/myfile* | while read x; do open_file $x | wc -l; done > stats

это работает, но проблема в том, что он выводит количество строк в файл stats без указания исходного имени файла. например, выводит:

100
150

вместо:

/mydir/...pathhere.../myfile1: 100
/mydir/...pathhere.../myfile2: 150

Второй вопрос:

Что если бы я хотел разделить число wc -l на константу, например, разделив его на 4, перед выводом в файл?

Я знаю, что число строк кратно 4, поэтому результат должен быть целым числом. Не уверен, как это сделать из приведенного выше сценария.

как мне сделать так, чтобы в исходном файле было указано исходное имя файла и результат wc -l?

спасибо.

Ответы [ 2 ]

5 голосов
/ 09 декабря 2011

Вы можете вывести имя файла перед подсчетом строк: echo -n "$x: " ; open_file $x | wc -l.Параметр -n для echo пропускает завершающий символ новой строки в выходных данных.

Для разделения целых чисел можно использовать expr, например, expr $(open_file $x | wc -l) / 4.

ИтакЦикл while будет выглядеть следующим образом:

while read x; do echo -n "$x: " ; expr $(open_file $x | wc -l) / 4 ; done
3 голосов
/ 09 декабря 2011

Попробуйте:

while read x; do echo -n "$x: " ; s=$(open_file $x | wc -l); echo $(($s / 4));

К тому моменту, когда вы доберетесь до wc(1), вы выбросили имя файла - все, что он когда-либо увидит, - pipe(7) - но вы можете перед тем, как открыть файл, введите имя файла самостоятельно.Если open_file завершится неудачно, вы получите уродливый выходной файл, но это может быть подходящим компромиссом.

$((...)) использует bash(1) арифметическое расширение.Он может не работать на вашей оболочке.

...