我想提取資料夾中文件名的第一個和第二個下劃線之間的字符,併計算其中存在的此類文件的數量。
該資料夾包含特定格式的文件,例如:
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
例如),它也會列印一個空白行。您可以使用 which 過濾掉那些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