Encontre números ausentes

Encontre números ausentes

Tenho uma grande lista de arquivos com nomes (vídeos)

Consegui escrever todos os nomes de arquivos em um arquivo de texto. Agora eu tenho um arquivo de texto com vários nomes de arquivos (um episódio por linha) Agora preciso de algo que possa ler esse arquivo de texto e me dizer qual Enúmero do episódio está faltando

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

Aqui está um exemplo de uma lista

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

Neste caso é fácil ver que os arquivos S1-E2estão S10-E4faltando. mas se eu tiver uma lista grande, como posso encontrar os arquivos ausentes? (Deixe o número da temporada S1, S2) só preciso verificar Eo número do episódio

O maior número do arquivo existente é S50-E2184e O menor número do arquivo existente éS1-E1

Responder1

Salve todos os nomes em um arquivo com o nome "file_with_list_of_files" e execute o comando abaixo em um terminal linux/unix [tentei no terminal mac]:

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

-- ou --

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

Isso lista todos os nomes de arquivos que não possuem um E após o primeiro - (hífen). Você também pode encontrar outras maneiras melhores de fazer isso.

Responder2

  1. Prepare um arquivo com todas as assinaturas dos episódios. Você não nos contou quantos episódios existem em cada temporada, mas obviamente precisa saber. É assim que você prepara o arquivo:

    >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
    

    Isso pressupõe que cada temporada comece com seu próprio episódio número um (sua pergunta não está clara sobre isso). O arquivo consiste em linhas em um formato S<n>-E<m>, por exemplo S2-E3.

  2. Crie um arquivo de episódios próprios no mesmo formato:

    cut -d - -f -2 your_current_list >owned_episodes
    

    O comando toma -comodeliminador e retorna fragmentos de linha até ofcampo número 2 da sua lista atual.

  3. Trate owned_episodescomo padrões e filtre all_episodespara encontrar linhas sem nenhum padrão:

    grep -vxFf owned_episodes all_episodes
    

    Observe que usamos -xaqui; a questão é que S50-E3não deveria corresponder S50-E31. -Fnão é necessário no seu caso, masem geraldeve-se usá-lo ao fornecer strings fixas. Oopçõessão:

    -F
    Combine usando strings fixas. Trate cada padrão especificado como uma string em vez de uma expressão regular. [...]

    -f pattern_file
    Leia um ou mais padrões do arquivo nomeado pelo pathname pattern_file. [...]

    -v
    Selecione linhas que não correspondam a nenhum dos padrões especificados. [...]

    -x
    Considere apenas as linhas de entrada que usam todos os caracteres da linha, excluindo a terminação, <newline>para corresponder a uma string fixa inteira ou expressão regular para serem linhas correspondentes.

informação relacionada