Перечислите количество похожих имен в папке - PullRequest
2 голосов
/ 25 октября 2019

У меня есть папка, которая содержит несколько файлов с одинаковым именем (различается по дате и времени в имени файла)

Я бы хотел получить счетчик для каждой группы / типа файлов в этой папке.

то есть

file1_25102019_111402.csv
file1_24102019_111502.csv
file1_23102019_121402.csv
file1_22102019_101402.csv

file2_25102019_161404.csv
file2_24102019_131205.csv
file2_23102019_121306.csv

Мне нужно иметь возможность вернуть что-то вроде этого;

file1 4
file2 3

В идеале ответом будет что-то вроде "количества файлов"чьи первые x символов - ABCD "

Имена файлов могут быть любыми. часть даты в примере была просто для того, чтобы продемонстрировать, что имена файлов начинаются с одинакового текста, но далее «что-то» дальше в имени (в данном случае дата)

Итак, я хочу иметь возможность группироватьих по первым символам X в имени файла.

т.е. я хочу иметь возможность сказать: «дайте мне подсчет всех файлов, сгруппированных по первым 4 символам или первым 5 символам и т. д.»

в SQL я бы сделал что-то подобное

select   substr(object_name,1,5),
         count(*) 
from     all_objects 
group by substr(object_name,1,5)

Отредактировано, чтобы показать больше примеров;

File1weifwoeivnw
File15430293fjwnc
File15oiejfiwem
File2sidfsfe
File29fu09f4n
File29ewfoiwwf
File22sdiufsnvfvs

Псевдокод:

Пример 1:

ls count of first 4 characters

Выход

File   7

Пример 2:

ls count of first 5 characters

Выход

File1    3
File2    4

Пример 3

ls count of first 6 characters

Выход

File1w    1
File15    2
File2s    1
File29    2
File22    1

1 Ответ

3 голосов
/ 25 октября 2019

Если вы хотите извлечь первые 5 символов, вы можете использовать

ls | cut -c1-5 | sort | uniq -c |awk '{ print $2,$1 }'

, который печатает для первого примера из вопроса

file1 3
file2 3

Если вы хотите иметь другое числосимволов, при необходимости измените команду cut, например, cut -c1-6 для первых 6 символов.

Если вы хотите разделить поля символом TAB вместо пробела, измените команду awkна

awk -vOFS=\\t '{ print $2,$1 }'

Это приведет к

file1   3
file2   3

Другие решения, которые работают с первым примером, который показывает имена файлов со строкой даты и времени, но не работаютс дополнительным примером, добавленным позже:

В файлах первого примера команда

ls | sed 's/_[0-9]\{8\}_[0-9]\{6\}/_*/' | sort | uniq -c

печатает

      3 file1_*.csv
      3 file2_*.csv

Объяснение:

  • Команда sed заменяет последовательность из _, 8 цифр, еще одного _ и еще 6 цифр на _*.
    С вашими первыми именами файлов вы получите file1_*.csv или file2_*.csv 3 раза каждый.
  • sort сортирует строки.
  • uniq -c считает количество последующих строк, равных.

Или, если вы хотите удалить все с первого _ до конца, вы можете использовать

ls | sed 's/_.*//' | sort | uniq -c

, который будет печатать

      3 file1
      3 file2

Вы можете добавить команду awk из первого решения, чтобы изменить формат вывода.

...