2013-11-28 46 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

相关问题