如何从列表中排序数据

2024-06-16 10:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究从bash到python的脚本重建。 我已经列出了许多服务器和计算机的SQL输出数据,这些数据在glpidb上已经有一个月没有更新了。你知道吗

在此列表中,我需要执行一些任务以获得适当的列表:

首先,我的数据类型是:

[OCS ID]

 servername01A-2015-05-15-13-42-25
 servernameB02-2018-03-25-05-32-35
 pt-clark-2018-09-25-14-10-05
 PT-Peter-2019-01-01-12-12-05
 G4535-2017-07-14-11-29-25
 G4535-2017-07-14-11-29-25
 g4535-2017-07-14-11-29-25
 pc-rescue-2013-11-11-11-12-05

现在,我需要:

  • 删除重复项
  • 删除ID“-2017-07-14-11-29-25”的第二部分以仅保留主机名a01或pt xxxx
  • 删除一些服务器(为此,我有一个要排除的服务器列表)
  • 删除所有以G****或G****开头的计算机
  • 删除所有以pt-或pt-,PC-,PC-开头的计算机

我试过的

 #exclusion file
    exclusion = open("./exclusion.list", "r")

    #data in
    data_in = open("./list_in", "r")

    #read files
    exclusion_lines = exclusion.readlines()
    data_lines = data_in.readlines()
  #start
    for a in data:
      Z = re.split("(.*)-([0-9]{4}.*)", a[1])
      matchPCPT = re.search("^([Pp][TtCc]-*)", Z[1])
      matchG = re.search("^([Gg][0-9]{4})", Z[1])
      if not matchPCPT and not matchG:
         print Z[1]

有了这个,我得到了这个输出:

servername01A
servernameB02
servernameB02
servernameB02
servername01A

以及一些我必须删除的服务器(包括排除列表)。你知道吗

拜托,我需要帮助,我是python的新手。你知道吗

祝你今天愉快

编辑:

这里有一个完整的输入列表

mailsrv1a-2015-05-15-13-42-25
mailsrv1b-2015-05-15-13-42-25
mailsrv1c-2015-05-15-13-42-25
mailsrv1a-2015-05-15-13-42-25
datasrvA2-2016-05-15-23-25-25
datasrvB2-2016-05-15-23-25-25
datasrvB2-2016-05-15-23-25-25
g4535-2017-07-14-11-29-25
pc-rescue-2013-11-11-11-12-05
PT-Peter-2019-01-01-12-12-05
pt-clark-2018-09-25-14-10-05
G4535-2017-07-14-11-29-25
benchsrv01rt-2017-07-14-11-29-25
benchsrv02rt-2017-07-14-11-29-25
esxsrv01-2017-07-14-11-29-25
esxsrv02-2017-07-14-11-29-25
solaris10g-2017-07-14-11-29-25
solaris10g-2017-07-14-11-29-25
solaris30g-2017-07-14-11-29-25
test1t-2017-07-14-11-29-25
test2t-2017-07-14-11-29-25
test3t-2017-07-14-11-29-25
test4t-2017-07-14-11-29-25
test5t-2017-07-14-11-29-25

以下是要排除的服务器列表:

benchsrv01rt
benchsrv02rt
solaris30g
solaris10g
test*t

我可以在排除列表中使用regex吗?你知道吗


Tags: 数据inre服务器ptid列表data
2条回答

可以使用标准方法处理字符串。你知道吗

第二部分总是有20个字符,所以您可以使用slice[:-20]来获取第一部分。你知道吗

使用text.lower().startswith( ("g", "pt-", "pc-") )可以跳过一些名称。你知道吗

可以将正确的名称添加到列表中(即result),并且可以检查它是否在此列表中以跳过重复的值。你知道吗

text = ''' servername01A-2015-05-15-13-42-25
 servernameB02-2018-03-25-05-32-35
 pt-clark-2018-09-25-14-10-05
 PT-Peter-2019-01-01-12-12-05
 G4535-2017-07-14-11-29-25
 G4535-2017-07-14-11-29-25
 g4535-2017-07-14-11-29-25
 pc-rescue-2013-11-11-11-12-05
 example-2013-11-11-11-12-05'''

data = text.split('\n')

excluded = ['benchsrv01rt', 'benchsrv02rt', 'solaris30g', 'solaris10g']

result = []

for name in data:
    name = name.strip()
    name = name[:-20]
    if not name.lower().startswith(('g', 'pc-', 'pt-')):
        if name not in excluded and name not in result:
           result.append(name)

print(result)

唯一的问题是G4535中的数字(如果您真的需要用数字识别名称),它可能需要regex

    import re

    if not re.match('g[0-9]{4}|pc-|pt-', name, re.IGNORECASE):
        if name not in excluded and name not in result:
           result.append(name)

编辑:其他问题可能是test*t,这也可能需要regex。你知道吗

import re

text = '''mailsrv1a-2015-05-15-13-42-25
mailsrv1b-2015-05-15-13-42-25
mailsrv1c-2015-05-15-13-42-25
mailsrv1a-2015-05-15-13-42-25
datasrvA2-2016-05-15-23-25-25
datasrvB2-2016-05-15-23-25-25
datasrvB2-2016-05-15-23-25-25
g4535-2017-07-14-11-29-25
pc-rescue-2013-11-11-11-12-05
PT-Peter-2019-01-01-12-12-05
pt-clark-2018-09-25-14-10-05
G4535-2017-07-14-11-29-25
benchsrv01rt-2017-07-14-11-29-25
benchsrv02rt-2017-07-14-11-29-25
esxsrv01-2017-07-14-11-29-25
esxsrv02-2017-07-14-11-29-25
solaris10g-2017-07-14-11-29-25
solaris10g-2017-07-14-11-29-25
solaris30g-2017-07-14-11-29-25
test1t-2017-07-14-11-29-25
test2t-2017-07-14-11-29-25
test3t-2017-07-14-11-29-25
test4t-2017-07-14-11-29-25
test5t-2017-07-14-11-29-25'''

data = text.split('\n')

excluded = ['benchsrv01rt', 'benchsrv02rt', 'solaris30g', 'solaris10g']

result = []

for name in data:
    name = name.strip()
    name = name[:-20]
    if not re.match('g[0-9]{4}|pc-|pt-|test[0-9]t', name, re.IGNORECASE):
        if name not in excluded and name not in result:
           result.append(name)

print(result)

编辑:您还可以使用list excludedexcluded = '|'.join(excluded)创建regex,您可以在re.match()中使用

excluded = [
    'benchsrv01rt',
    'benchsrv02rt',
    'solaris30g',
    'solaris10g',
    'g[0-9]{4}',
    'pc-',
    'pt-',
    'test[0-9]t',
]

excluded = '|'.join(excluded)
#print(excluded)

result = []

for name in data:
    name = name.strip()
    name = name[:-20]
    if not re.match(excluded, name, re.IGNORECASE):
        if not in result:
           result.append(name)

print(result)

下面是一个示例(它包含一些Python列表理解)

# init list
datalist = [ 'servername01A-2015-05-15-13-42-25',
             'servernameB02-2018-03-25-05-32-35',
             'pt-clark-2018-09-25-14-10-05',
             'PT-Peter-2019-01-01-12-12-05',
             'G4535-2017-07-14-11-29-25',
             'G4535-2017-07-14-11-29-25',
             'g4535-2017-07-14-11-29-25',
             'pc-rescue-2013-11-11-11-12-05' ]

# 1. remove duplicates
datalist = list(set(datalist))

# 2. remove second part of ID
for i,data in enumerate(datalist):
    tmp = '-'.join([tmp_str for tmp_str in data.split('-') if not tmp_str.isdigit()]) 
    datalist[i] = tmp

# 3. remove some servers
# I skipped this step since you did not provide the list of servers to exclude

# 4. remove all computer which starting by G**** or g****
datalist = [d for d in datalist if not d.startswith("G") and not d.startswith("g") ]


# 5. remove all computer which starting by pt- or PT-, PC-, pc-
for prefix in ['pt-', 'PT-', 'PC-', 'pc-']:
    datalist = [d for d in datalist if not d.startswith(prefix) ]

# 6. sort
datalist = sorted(datalist)

最终输出为:

enter image description here

相关问题 更多 >