Найдите недостающие числа

Найдите недостающие числа

У меня есть большой список файлов с именами (видео)

Мне удалось записать все имена файлов в текстовый файл. Теперь у меня есть текстовый файл с множеством имен файлов (по одному эпизоду на строку). Теперь мне нужно что-то, что может прочитать этот текстовый файл и сказать мне, какой Eномер эпизода отсутствует.

S1-E18-(Date)-(Title)-(Random numbers).mp4

Вот пример списка

S1-E1-20100526-title-of-video-1400316375.mp4
S1-E3-20100517-title-of-video-15457547.mp4
S10-E5-20100421-title-of-video-14467457.mp4
S5-E7-20120912-title-of-video-17467457.mp4

В этом случае легко увидеть, что файлы S1-E2отсутствуют S10-E4. Но если у меня большой список, как мне найти недостающие файлы? (Оставьте номер сезона S1, S2) просто нужно проверить E, означает ли это номер эпизода

Самый большой номер существующего файла равен S50-E2184, а самый маленький номер существующего файла равенS1-E1

решение1

Сохраните все имена в файле с именем «file_with_list_of_files» и выполните следующую команду в терминале Linux/Unix [я пробовал в терминале Mac]:

cat file_with_list_of_files | sed 's/^[A-Z][0-9]*-//g' | grep -v "^E"

-- или --

cat file_with_list_of_files | awk -F- '{print $2}' | grep -v "^E"

Это список всех файлов, имена которых не содержат E после первого - (дефис). Вы также можете найти другие лучшие способы сделать это.

решение2

  1. Подготовьте файл со всеми подписями эпизодов. Вы не сказали нам, сколько эпизодов в каждом сезоне, но вам, очевидно, нужно это знать. Вот как вы готовите файл:

    >all_episodes   # just to empty the file which may or may not exist
    printf 'S1-E%s\n'  {1..3}    >>all_episodes   # 3 episodes in season 1
    printf 'S2-E%s\n'  {1..5}    >>all_episodes   # 5 episodes in season 2
    printf 'S3-E%s\n'  {1..8}    >>all_episodes
    # and so on
    printf 'S50-E%s\n' {1..2184} >>all_episodes
    

    Это предполагает, что каждый сезон начинается с собственного эпизода номер один (ваш вопрос не ясен). Файл состоит из строк в форме S<n>-E<m>, например S2-E3, .

  2. Создайте файл собственных эпизодов в той же форме:

    cut -d - -f -2 your_current_list >owned_episodes
    

    Команда принимает -какгelimiter и возвращает фрагменты строки дофполе номер 2 из вашего текущего списка.

  3. Рассматривать owned_episodesкак шаблоны и фильтровать all_episodesдля поиска строк без каких-либо шаблонов:

    grep -vxFf owned_episodes all_episodes
    

    Обратите внимание, что мы используем -xздесь; суть в том, что S50-E3не должно совпадать S50-E31. -Fв вашем случае это не обязательно, нов общемследует использовать его при подаче фиксированных строк.параметрыявляются:

    -F
    Сопоставление с использованием фиксированных строк. Обрабатывать каждый указанный шаблон как строку, а не как регулярное выражение. [...]

    -f pattern_file
    Считайте один или несколько шаблонов из файла, указанного в имени пути pattern_file. [...]

    -v
    Выберите строки, не соответствующие ни одному из указанных шаблонов. [...]

    -x
    <newline>Совпадающими считаются только те входные строки, в которых все символы строки, за исключением завершающего, соответствуют всей фиксированной строке или регулярному выражению.

Связанный контент