Bash: найти файлы в каталоге, содержащем менее n строк - PullRequest
1 голос
/ 11 июня 2019

У меня есть каталог с несколькими файлами:

filename_10-1.txt
filename_10-2.txt
...
filename_10-1000.txt
filename_20-1.txt
filename_20-2.txt
...
filename_20-1000.txt
...
filename_600-1000.txt

Я хотел бы перечислить все файлы, которые содержат меньше строк, чем вдвое больше первого числа в имени файла (например, filename_10-874 должно иметь 20 строк (2 * 10 строк) и filename_40-684 должны иметь 80 строк (2 * 40 строк)).

Подход

Шаг 1: Я могу сосчитать числострок в одном файле, например:

wc -l filename_10-1.txt

Шаг 2: Найти количество строк во всех файлах

for i in $(find filename_* -type f); 
    do wc -l $i; 
done

Шаг 3: Список только тех файлов, которые содержат меньше строк, чемимя их файла указано.

Я наткнулся на эту запись , однако я не смог изменить код в соответствии со своими потребностями.

Вопрос

Как мне перечислить все файлы, которые содержат меньше строк, чем число в имени файла?

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Вы можете использовать этот скрипт:

shopt -s extglob

for f in *.txt; do
   n="${f//@(*_|-*)}" # extract first number
   (( $(wc -l < "$f") < 2*$n )) && echo "$f" # list files with less lines than 2*$n
done

Синтаксис расширенного глоба (@(*_|-*)) описан в этого урока .Здесь в этом коде *_ удаляет весь текст, пока мы не получим _, а затем -* удаляет весь текст после -.

0 голосов
/ 11 июня 2019

Вы можете использовать awk для подсчета количества строк и печати имени файла, если оно превышает заданное число.С Gnu Awk вы можете сделать:

awk 'BEGINFILE { f=FILENAME; n=gsub(/^.*_/,"",f)*2 }
     (FNR == n) { nextfile }
     ENDFILE{ if (FNR < n) print FILENAME }' filename_*.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...