如何提取檔案名稱的第一個和第二個下劃線之間的字元並統計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例如),它也會列印一個空白行。您可以使用 which 過濾掉那些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

相關內容