You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于起始字符用Pandas构建列:Linux解析数据处理需求

Pandas实现Linux Netgroup数据提取与结构化

我来帮你搞定这个Pandas实现的需求!之前用Shell完成的逻辑,用Pandas可以通过逐行跟踪组名+结构化记录的方式轻松实现,下面是详细的步骤、代码和解释:

示例输入数据

假设你的文本文件netgroup_data.txt内容如下:

cn: group1
nisNetgroupTriple: (host1.example.com, example.com, )
nisNetgroupTriple: (host2.example.com, example.com, )
cn: group2
cn: group3
nisNetgroupTriple: (host3.example.com, example.com, )

实现代码

import pandas as pd

# 读取文本文件,过滤空白行并去除每行首尾空格
with open('netgroup_data.txt', 'r') as f:
    lines = [line.strip() for line in f if line.strip()]

current_group = None
records = []

for line in lines:
    # 处理组名行(cn:开头)
    if line.startswith('cn:'):
        # 如果上一个组没有对应的主机记录,先添加一条Host_Name为None的记录
        if current_group is not None:
            records.append({'Group_Name': current_group, 'Host_Name': 'None'})
        # 提取并更新当前组名
        current_group = line.split('cn:')[1].strip()
    
    # 处理主机行(nisNetgroupTriple:开头)
    elif line.startswith('nisNetgroupTriple:'):
        # 解析nisNetgroupTriple格式,提取主机名
        triple_content = line.split('nisNetgroupTriple:')[1].strip()
        # 去掉括号,按逗号分割后取第一个元素(主机名)
        host_name = triple_content.strip('()').split(',')[0].strip()
        # 确保当前有活跃的组名,再添加记录
        if current_group is not None:
            records.append({'Group_Name': current_group, 'Host_Name': host_name})

# 处理最后一个组:如果没有对应的主机记录,补充一条Host_Name为None的记录
if current_group is not None:
    # 检查最后一条记录是否属于当前组,不属于则补充
    if not records or records[-1]['Group_Name'] != current_group:
        records.append({'Group_Name': current_group, 'Host_Name': 'None'})

# 转换为DataFrame
final_df = pd.DataFrame(records)
print(final_df)

期望输出结果

运行代码后会得到如下结构化的DataFrame:

Group_Name         Host_Name
0    group1  host1.example.com
1    group1  host2.example.com
2    group2               None
3    group3  host3.example.com

关键逻辑解释

  1. 逐行跟踪组名:用current_group变量记录当前正在处理的组,遇到新的cn:行时,先处理上一个未完成的组(如果没有主机记录则补充None),再更新组名。
  2. 解析主机名:针对nisNetgroupTriple:的格式(通常是(主机名,域名,)),通过字符串分割、去括号的方式提取主机名。
  3. 边界处理:遍历结束后检查最后一个组是否有对应的主机记录,避免遗漏无主机的组。

可选优化

  • 如果你的数据中存在nisNetgroupTriple:行在cn:行之前的情况,可以添加判断跳过这类无效行,或者抛出警告提示数据异常。
  • 如果主机名格式有变体(比如(host,,)),当前的解析逻辑依然能正确提取主机名,因为只取逗号分割后的第一个元素。

内容的提问来源于stack exchange,提问作者user2023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:17:31