Ubuntu 命令 - awk - 列出具有不同前缀的文件

Ubuntu 命令 - awk - 列出具有不同前缀的文件

我在 Ubuntu 机器上有一个目录,其中包含大量文件以及以相同前缀开头的文件子组。我需要目录文件名称中存在的不同前缀列表,如下所示。对于列表:

pj6_ex_18_i535_tr_92.pdf
pj6_ex_18_i535_tr_95.pdf
...
pj6_ex_14_i535_tr_96.pdf
pj6_ex_14_i535_tr_97.pdf
pj6_ex_14_i535_tr_98.pdf
....
pj1_ex_24_i535_tr_91.pdf
pj1_ex_24_i535_tr_92.pdf
pj1_ex_24_i535_tr_93.pdf
...
pj3_ex_16_i535_tr_23.pdf
pj3_ex_16_i535_tr_22.pdf

我需要得到以下列表。我想通过 awk 命令这是可能的,但我不知道如何。

pj6_ex_18_
pj6_ex_14_i535_
pj1_ex_24_i535_
pj3_ex_16_i535_

我怎样才能做到这一点?

答案1

$ perl -lne '
    s/_tr.*/_/;
    unless (defined($prefixes) && m/^($prefixes)_/) {
      $prefixes{$_}++;
      $prefixes=join("|", map +( "\Q$_\E" ), keys %prefixes);
    };

    END { print join("\n", sort keys %prefixes) }' <(sort input.txt)
pj1_ex_24_i535_
pj3_ex_16_i535_
pj6_ex_14_i535_
pj6_ex_18_i535_

或者更短,只跟踪看到的最后一行而不是每个唯一的前缀:

$ perl -lne '
    next if (defined($last) && m/^\Q$last\E/);
    s/_tr.*/_/;
    $last=$_;
    print' <(sort input.txt)
pj1_ex_24_i535_
pj3_ex_16_i535_
pj6_ex_14_i535_
pj6_ex_18_i535_

在这两个版本中,匹配操作中的\Qand会阻止任何正则表达式元字符在.例如,如果它包含类似 的内容,它将被解释为文字和文字,而不是“零个或多个任何字符”。\Em//$last.*.*

相关内容