查找缺失的数字

查找缺失的数字

我有一个带有名称的文件大列表(视频)

我设法将所有文件名写入一个文本文件中。现在我有一个包含大量文件名的文本文件(每行一个剧集)现在我需要一些可以读取该文本文件并告诉我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
    

    该命令将-作为d消除符并返回行片段,直到F当前列表中的字段号 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>来匹配整个固定字符串或正则表达式的输入行视为匹配行。

相关内容