2013-11-28 82 views
-3

我在linux文件夾中以特定格式存在文件名。我想在這些文件名的第一個和第二個下劃線之間提取字符串,並在該文件夾中計算這種類型的文件。該文件名是這樣的:腳本來提取文件夾中文件名的第一個和第二個下劃線之間的字符串,並顯示此類文件的計數

2305237803310_ABC_A05_1378414278883.hl7 

20132480014907_DEF_R01_1378420192336.hl7 

20132480014793_DEF_R01_1378418604889.hl7 

2313642803310_ABC_A08_1378824296915.hl7 

2313614403310_ABC_A08_1378823995805.hl7 

2313614403310_MNY_A08_1378823995805.hl7 

我的腳本的輸出應該給我:

ABC 3 

DEF 2 

MNY 1 
+1

'削減-d_ -f2 filename' – devnull

+1

如果你問有關你的代碼問題的問題,我們不打算做所有的工作適合你,我們將幫助:) – aIKid

+1

好..至少不是我,其他人已經完成了它雖然X) – aIKid

回答

1

我會使用一個正則表達式,os.listdir和字典跟蹤計數。像這樣的東西相對緊湊,這種方法可以推廣到其他類似的問題。

import re 
import os 
import collections 


def print_names(): 
    names_count = collections.Counter() 
    regex = r'[^_]+_([^_]*)_.*' 
    for file_name in os.listdir("."): 
     match = re.match(regex, file_name) 
     if match: 
      names_count[match.groups()[0]] += 1 

    for name, count in names_count.items(): 
     print(name, count) 


if __name__ == "__main__": 
    print_names() 

輸出與例如文件: ABC 3 MNY 1 DEF 2

+0

由於我使用Python 2.6.6我略微改變了代碼和它的工作以及導入重新 進口OS resultsDict = {} 正則表達式= R'[^ _] + _([^ _] *)_。 *」 用於os.listdir FILE_NAME( 「 」): 米= file_name.split(「 _」) 如果len(米)> 2: 的myString = M [1] 如果在的myString resultsDict: resultsDict [myString的] + = 1 否則: resultsDict.update({的myString:1}) 否則: \t打印 「!串中錯誤有小於2 _」 print resultsDict – Bullu

3

使用defaultdictCountersetdefault__missing__成語計數它們。下面是__missing__

txt='''\ 
2305237803310_ABC_A05_1378414278883.hl7 
20132480014907_DEF_R01_1378420192336.hl7 
20132480014793_DEF_R01_1378418604889.hl7 
2313642803310_ABC_A08_1378824296915.hl7 
2313614403310_ABC_A08_1378823995805.hl7 
2313614403310_MNY_A08_1378823995805.hl7''' 

class Dicto(dict): 
    def __missing__(self, key): 
     self[key]=0 
     return self[key] 

d=Dicto()  
for line in txt.splitlines(): 
    k=line.split('_')  
    d[k[1]]+=1 

print d 
# {'MNY': 1, 'ABC': 3, 'DEF': 2} 
1

使用字典和拆分它可以很容易:

s = ["2305237803310_ABC_A05_1378414278883.hl7","20132480014907_DEF_R01_1378420192336.hl7","20132480014793_DEF_R01_1378418604889.hl7", 
    "2313642803310_ABC_A08_1378824296915.hl7","2313614403310_ABC_A08_1378823995805.hl7","2313614403310_MNY_A08_1378823995805.hl7"] 

resultsDict = {}  
for value in s: 

    m = value.split("_") 

    if len(m) > 2:  
     myString = m[1]  
     if myString in resultsDict: 
      resultsDict[myString] += 1 
     else: 
      resultsDict.update({myString: 1})  
    else: 
     print "error in the string! there are less then 2 _" 

print resultsDict 

輸出:

{'MNY': 1, 'ABC': 3, 'DEF': 2} 
0

bash的(100%的內部命令):

#!/bin/bash 

declare -A ARRAY 

cd "/your/linux/folder" 
for TAG in * 
do TAG=${TAG#*_}; TAG=${TAG%%_*}; ((++ARRAY[$TAG])) 
done 

for TAG in ${!ARRAY[*]} 
do echo $TAG ${ARRAY[$TAG]} 
done 

輸出:

ABC 3 
MNY 1 
DEF 2 
+0

...如果你想輸出排序...管道排序;-) – thom

相關問題