如何提取文件名第一个和第二个下划线之间的字符并计算 Linux 文件夹中此类文件的数量?

如何提取文件名第一个和第二个下划线之间的字符并计算 Linux 文件夹中此类文件的数量?

我想提取文件夹中文件名第一和第二个下划线之间的字符,并计算其中存在的此类文件的数量。

该文件夹包含特定格式的文件,例如:

2305195303310_ABC_A08_1378408840043.hl7

2305195303310_ABC_A08_1378408840043.hl7
Q37984932T467566261_DEF_R03_1378825633215.hl7
37982442T467537201_DEF_R03_1378823455384.hl7
37982442T467537201_MNO_R03_1378823455384.hl7
2305195303310_ABC_A08_1378408840053.hl7
Q37984932T467566261_DEF_R03_1378825633215.hl7
37982442T467537201_MNO_R03_1378823455384.hl7

等等…

脚本的输出应该给我如下结果:

ABC 3
DEF 3
MNO 2

答案1

ls | cut -d_ -f2 | sort | uniq -c

答案2

你可以用经典的 *nix 方式来做到这一点,通过将小命令串在一起。首先,找到感兴趣的文件,为此你可以使用 shell通配符

for i in *_*_*; do echo "$i"; done

该命令将打印当前目录中名称包含两个下划线的所有文件。要提取这两个下划线之间的字符串,您可以使用cut,告诉它用作_字段分隔符并打印第二个字段:

cut -d '_' -f 2

将第一个命令通过第二个命令传输将打印您感兴趣的字符串,但对于下划线之间没有字符的情况(foo__bar例如),它也会打印一个空行。您可以使用grep .它过滤掉这些,这将仅打印包含至少一个字符(包括空格)的行。最后,您可以通过将输出传递到sortuniq -c

综合起来,您可以得到:

$ for i in *_*_*; do echo "$i" | cut -d '_' -f 2 ; done | 
   grep . | sort | uniq -c

  3 ABC
  2 DEF
  1 MNO

如果您确实希望数字位于另一边,您可以使用awk

$ for i in *_*_*; do echo "$i" | cut -d '_' -f 2 ; done | 
   grep . | sort | uniq -c | awk '{print $2,$1}'

ABC 3
DEF 2
MNO 1

答案3

这是使用 Perl 完成这项工作的一种方法。

perl -aE '/^[^_]+_\K[^_]+/ && $h{$&}++}{say$_," ",$h{$_} for sort keys %h' file
ABC 3
DEF 3
MNO 2

解释:

perl -aE                # invoque Perl compiler with autosplit lines
/^[^_]+_\K[^_]+/        # match non _ characters after the first _
 &&                     # execute the next command if a match is found
$h{$&}++}               # increment a counter for each match founded
{say$_," ",$h{$_}       # finally print each match and the counter associated
for sort keys %h        # for each sorted matches

相关内容