我想提取文件夹中文件名第一和第二个下划线之间的字符,并计算其中存在的此类文件的数量。
该文件夹包含特定格式的文件,例如:
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 .
它过滤掉这些,这将仅打印包含至少一个字符(包括空格)的行。最后,您可以通过将输出传递到sort
和uniq -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