python join_join与python实现列合并

2023-11-13

在linux下powerpath对盘与更改盘符名 篇中提到了修改聚合后的多路径别名的问题,在数据库RAC增加存储盘的过程中,还会涉及一个常见的问题是多个RAC之间进行盘符名核对的问题 。这里还是以三节点RAC 加 EMC存储盘为例,安装EMCpower path软件后,通过powermt查看时会有Logical device ID与聚合别名,其中Logical device ID与SCSI_ID对应,是唯一值 。扫盘后,相同的Logical device ID在三台主机上对应的别名可能是不同的 ,想要修改一致,就需要核对三台主机同一ID之间的对就别名的区别。

想要实现上面的效果,通过shell join 命令可以实现,通过python脚本也可以实现。 这里分别介绍下。

一、加盘前后对比

将加盘前后的结果处理后,通过diff命令对比后,将新增的内容获取出的结果如下:[root@irora13s ~]# powermt display dev=all|grep 'Pseudo\|Logical' |awk '{if(NR%2==0){printf $0 "\n"}else{printf "%s\t",$0}}' > /tmp/powermt_new

[root@irora13s ~]# cat diskinfo/powermt|grep 'Pseudo\|Logical' |awk '{if(NR%2==0){printf $0 "\n"}else{printf "%s\t",$0}}' > /tmp/powermt_old

[root@irora13s ~]# diff /tmp/powermt_new /tmp/powermt_old

27d26

< Pseudo name=emcpoweraz Logical device ID=0B56

29,37d27

< Pseudo name=emcpowerba Logical device ID=0B5A

< Pseudo name=emcpowerbb Logical device ID=0B5E

< Pseudo name=emcpowerbc Logical device ID=0B62

< Pseudo name=emcpowerbd Logical device ID=0B66

< Pseudo name=emcpowerbe Logical device ID=0B6A

< Pseudo name=emcpowerbf Logical device ID=0B6E

………………省略

由于这里只需要name和id对应值,这个再awk简单处理下,结果如下 :

# diff /tmp/powermt_new /tmp/powermt_old |grep '>' |awk '{print $NF,$3}' > 1.txt

ID=0B56 name=emcpoweraz

ID=0B5A name=emcpowerba

…………省略

二、join 合并

按上面的操作,将host1、host2、host3分别处理后,就会发现:host1上0B56 对应的设备名为emcpoweraz ,host2上应的设备名可能为emcpowerax,host3上对应的可能为emcpoweran ,想要实现的效果如下:

#设备ID host1 host2 host3

ID=0B56 name=emcpoweraz name=emcpowerax name=emcpoweran

这样三台主机的那里有差距可以一目了然的看出 。由于join 只支持两个文件的合并,而且合并前需要对相应的列进行排序,所以这里可以利用管道,对三个文件进行处理。命令如下:

[root@localhost disk]# join -a1 <(sort 3.txt) <(sort 2.txt) | join - <(sort 1.txt)

ID=0A72 name=emcpowerdq name=emcpowerbh name=emcpowerbh

ID=0A76 name=emcpowerdr name=emcpowerdq name=emcpowergb

ID=0A7A name=emcpowerds name=emcpowerdr name=emcpowergc

ID=0A7E name=emcpowerdt name=emcpowerds name=emcpowerds

ID=0A82 name=emcpowerdu name=emcpowerdt name=emcpowergh

…………省略

这里使用了a1参数的作用是,3.txt中如果有2.txt中不存在的内容也进行输出。由于三号点涉及ADG同步,所以这里对3.txt进行了特殊处理。

三、python实现

python的写法比较多,虽然不如join 简单,但更容易理解,这里总结了几种写法,如下:

脚本1:

f1 = open('1.txt', 'r').readlines()

f2 = open('2.txt', 'r').readlines()

#print [ "{0[0]} {0[1]} {1[1]}".format(l1.split(), l2.split()) for l1 in f1 for l2 in f2 if l1.split()[0] == l2.split()[0] ]

joinList = [ "{0[0]} {0[1]} {1[1]}".format(l1.split(), l2.split()) for l1 in f1 for l2 in f2 if l1.split()[0] == l2.split()[0] ]

for joinLine in joinList:

print joinLine

脚本2:

f1 = open('1.txt', 'r').readlines()

f2 = open('2.txt', 'r').readlines()

#print [ (l1.split()[0], l1.split()[1], l2.split()[1]) for l1 in f1 for l2 in f2 if l1.split()[0] == l2.split()[0] ]

joinList = [ (l1.split()[0], l1.split()[1], l2.split()[1]) for l1 in f1 for l2 in f2 if l1.split()[0] == l2.split()[0] ]

for joinLine in joinList:

print ' '.join(joinLine)

脚本3:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

__author__ = '361way.com'

__author_site__ = 'www.361way.com'

import sys

import getopt

input_file1 = ""

input_file2 = ""

try:

opts, args = getopt.getopt(sys.argv[1:], "h", ["input1=", "input2="])

except getopt.GetoptError as err:

print(str(err))

for op, value in opts:

if op == "--input1":

input_file1 = value

elif op == "--input2":

input_file2 = value

elif op == "-h":

print("python get_value_according_first_column.py --input1 dat1 --input2 dat2 > out.txt")

sys.exit()

# 以上可忽略,定义shell中接受的参数及数据

f1 = open(input_file1, 'r')

f2 = open(input_file2, 'r')

lines1 = f1.readlines() # 将整个文件读作一个列表,可以添加 print lines1 查看,这里一行表示里边的一个元素(字符串),如lines1[0],则表示第一行

lines2 = f2.readlines() # 将整个文件读作一个列表,可以添加 print lines2 查看,第一行第一列,lines2[0][0]

for line1 in lines1: # 遍历列表lines1中的每个元素,及遍历读取文件1的每一行

line1 = line1.strip().split() # 这里的一行就是一个字符串,使用字符串的strip方法,去掉行尾换行符,使用split分割字符串成列表

for line2 in lines2:

line2 = line2.strip().split() # 同样 遍历文件2中每一行

if line1[0] in line2: # line1[0] (注意是line 不是lines) 表示某一行的第一列,即查询某行第一列是否在文件2中,如果在

line1.extend(line2[1:]) # 在的话,则将 文件2中的第二列以后的部分添加到第一行的后边

print ' '.join(line1) # 将列表 line1 转换成字符串打印

f1.close() # 关闭文件

f2.close() # 关闭文件

用法如下:

python test.py --input1 dat1.txt --input2 dat2.txt > 2.out.txt

脚本4:

from os import linesep

f1 = open('/tmp/disk/1.txt')

f2 = open('/tmp/disk/2.txt')

f3 = open('/tmp/disk/3.txt', 'w')

lines1 = f1.readlines()

lines2 = f2.readlines()

for line1 in lines1:

k = line1.split()[0]

for line2 in lines2:

if line2.split()[0] == k:

line3 = line1.replace(linesep, '') + " " + str(line2.split()[1]) + linesep

f3.write(line3)

f1.close()

f2.close()

f3.close()

这里作用是将1.txt与2.txt的比对结果输出到3.txt 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python join_join与python实现列合并 的相关文章

  • Unity3D 车流线

    效果图 因为是静态图片可能不太能看出效果 车流线主要是用来模拟城市中行动的车 直接使用车模型 会在大场景中看不清楚 效果不会很好 一 实现原理 车流线肯定是需要绘制线条的 我这里直接使用TrailRender 这个拖尾功能可能很好帮助我们控
  • NPM酷库:accounting,格式化数字和货币

    NPM酷库 每天两分钟 了解一个流行NPM库 上次 我们了解到如何使用numeral库格式化数字 今天我们继续认识另外一个用来格式化数字的库accounting accounting accounting 主要提供的方法有 formatMo
  • Shuffle过程详解

    Shuffle过程详解 Shuffle过程是MapReduce的核心 最近看了很多资料 网上说法大体相同 但有些地方有一点点出入 就是各个阶段的执行顺序 总个shuffle过程可以看做是从map输出到reduce输入的这个中间过程 在这个中
  • Java 学习路线

    文章目录 Java基础 1 Java 基本功 1 1 Java 入门 基础概念与常识 1 2 Java 语法 1 3 基本数据类型 1 4 方法 函数 2 Java 面向对象 2 1 类和对象 2 2 面向对象三大特征 2 3 修饰符 2
  • web前端面试的自我介绍

    开始背景 1 面试官在你自我介绍的时候 才有时间看你的简历 人太多没时间看 看了也记不住 2 你在自我介绍中 他在想问你什么问题 3 了解你语言 表达能力 自信气场 仪表形态 常规低级错误 1 对面试官说 简历上有你自己看吧 2 对照简历就
  • .sh文件中第一行 #!/bin/bash -il 是什么

    sh文件中第一行 bin bash il 是什么 是执行该脚本文件的解释器的路径和选项 在一个 shell 脚本文件的第一行加上 符号 称为 shebang 它告诉系统使用哪个解释器执行这个脚本 在 bin bash 的例子中 它告诉系统使
  • Deep learning-based CSI Feedback for Beamforming 1

    1 Abstract The potentials of massive multiple input multipleoutput MIMO are all based on the available instantaneous cha
  • 目标检测综述-------深度学习用于目标检测的近期进展 introduction(一)

    论文题目 Recent Advances in Deep Learning for Object Detection 论文地址 摘要 目标检测是计算机视觉一个重要的视觉问题并且在最近得到了广泛的研究 视觉目标检测致力于在给定的图像内找到带有
  • “No input file specified “问题的处理

    接手新项目 配置的时候 遇上了 No input file specified 的问题 第一反应 是上网搜 关于这个问题的帖子有很多 总的来说 得到的问题原因有 一 跟路径有关系 路径没指对 二 可能是权限的问题 如 不允许访问 三 SCR
  • 《实现VM机与本机互ping》

    实现VM机与本机互ping 1 安装VM机及对应的OS gt 到本机检测VMware Network Adapter VMnet8是否已经生成 网上邻居 网络连接 2 查看 VMware Network Adapter VMnet8 网络I
  • C++ for循环跳过某一项求和

    include
  • 双三次插值及Matlab实现

    双三次插值及Matlab实现 一 简单实例 采用简单实例进行对双三次插值的介绍 由于双三次插值对于目标图像的某一像素进行估计时 所采用的像素信息为其周围16个像素点信息 因此不同于最近邻插值和双线性插值 此时假设有 5 5 5 times5
  • feign.FeignException: status 400 reading xxx#xxxx(String); content:

    网上有很多不一样的说话 我这个主要是因为feign的那个方法使用的 RequestParam注解 这个接收的参数长度过长造成的 这也是feign就算使用post方法 RequestParam的那个参数他会放在请求地址后面 而不是放在请求体
  • JupyterNotebook设置Python环境的方法步骤

    不多说 看链接 https stackoverflow com questions 39604271 conda environments not showing up in jupyter notebook conda activate
  • LAMP架构(qq农场)、部署jira、Java+数据库环境、

    LAMP架构 论坛 yum y install httpd yum y install mariadb mariadb server yum y install php php fpm php mysql php gd gd systemc
  • Linux多线程

    什么是线程 线程是OS调度的基本单位 其实在Linux环境下 线程可以看做是轻量级线程 Linux的线程本质仍然是进程 Linux先有进程后有线程 当创建了一个进程时 系统给他分配一段4G的虚拟内存 并在其内生成进程的PCB 当他调用相关函
  • 2023年网络安全趋势【网安人必看】

    数据安全越来越重要 我国 数据安全法 提出 建立健全数据安全治理体系 各地区部门均在探索和简历数据分类分级 重要数据识别与重点保护制度 数据安全治理不仅是一系列技术应用或产品 更是包括组织构建 规范制定 技术支撑等要素共同完成数据安全建设的
  • android Native和 Flutter 通信

    android 工程集成Flutter 集成方式主要是两种 1 工程的方式集成 首先创建android 和flutter工程 工程路径必须在同一路径下 1 在android 工程的settings gradle 文件中添加 rootProj

随机推荐

  • oracle的jdbc的版本与jdk对应关系

    连接类型 1 JDBC OCI oci是oracle call interface的缩写 此驱动类似于传统的ODBC 驱动 因为它需要Oracle Call Interface and Net8 所以它需要在运行使用此驱动的JAVA程序的机
  • 《软件测试》第六章 检查代码

    软件测试 第六章 检查代码 6 0 前言 6 1 静态白盒测试 检查设计和代码 6 2 正式审查 6 2 1 同事审查 6 2 2 走查 6 2 3 检验 6 3 编码标准和规范 6 4 通用代码审查清单 6 4 1 数据引用错误 6 4
  • MATLAB:画图

    目录 一 一个图上显示多个函数 二 在一个窗口显示多个图片 三 图形标注 四 线条属性 一 一个图上显示多个函数 1 相当于将上一个plot 保持住 plot B big angle x r hold on plot big angle x
  • Pandas中 DataFrame中添加一行/一列

    概述 添加行df loc 以及df append 两种方法 添加列df 和df insert 两种方法 添加行例concat 和reindex 两种方法 一 添加行 1 采用loc 方法 loc方法和iloc方法一样 可以索引DataFra
  • 定义和初始化vector对象

    和任何一种类类型一样 vector模板控制着定义和初始化向量的方法 下面列出了定义vector对象的常用方法 默认初始化 vector对象从而创建一个指定类型的空vector vector
  • Android Studio SDK Manager license 失效问题

    Before building your project you need to accept the license agreements and complete the installation of the missing comp
  • 创客教育中常见的视觉识别摄像头介绍

    近年来 创客教育 人工智能教育在中小学日渐普及 从目前中小学教育的应用层面来说 主要包含了视觉和听觉等几个领域的人工智能教学 因此 摄像头模块或传感器 作为视觉领域必不可少的教具 也被应用的越来越多 市面上越来越多的厂家或机构 也开发了许多
  • java项目时间不够怎么办_时间总是不够用怎么办?

    我在最近两年逐渐体会到两件事 1 这个世界上最公平的事情 就是每人每天拥有24个小时 2 绝大数人都是普通人 一次只能做一件事 我打游戏有三个原则 第一不玩匹配 其二不开声音 最后基本不双排 简单的三条原则 可以大大缩减我每赛季登录王者的时
  • 【git】git命令和相关脚本

    目录 git clone git checkout git diff git diff 忽略文件权限被修改的文件 对比两个分支差异 git add git pull rebase git pull git fetch git reset g
  • 如何查看linux版本 如何查看LINUX是多少位

    一 如何得知自己正在使用的linux是什么版本呢 下面的几种方法将给你带来答案 1 查看内核版本命令 1 root q1test01 cat proc version Linux version 2 6 9 22 ELsmp bhcompi
  • 【数组指针】 仅此一篇 让你深刻理解数组指针

    作者 Mitu 本帖内容著作权归作者所有 转载请务必保留本文链接 数组指针 数组指针 顾名思义 就是指向数组的指针 我们是这样定义它的 int p n n为要定义的个数 按照优先级运算 与 优先级相同 根据结合律 就从左向右运算 里是 p
  • vue中input中v-model语法糖原理

    v model是双向数据绑定 其本质是一个语法糖 我们怎么理解v model在中的运行原理呢 我们将代码进行拆分分析一下 div div
  • mysql如何快速导入大sql文件

    phpmyadmin有内存等的限制 所以文件过大会导致数据导入不全问题 Navicat Premium工具运行sql数据是可以倒全但是效率低 无法快速实现数据恢复 博主亲测source导入12Gsql mysql命令行执行 use data
  • Animator is not playing an AnimatorController

    调用bodyAnimator SetTrigger时出现标题的警告 原因是Animator所在的GameObject是不可见的 可以打印出activeInHierarchy确认一下 把动画的播放方式改为bodyAnimator Play就会
  • ruoyi的springboot微信小程序登录实现方式

    文章目录 前言 一 微信小程序的登录接口 二 微信用户数据库设计 三 springboot登录接口实现 1 新建实体WxUser 2 修改LoginUser类 3 增加wxLogin接口 4 微信小程序登录接口 5 开放接口 总结 前言 主
  • vue考试系统后台管理项目-登录、记住密码功能

    考试系统后台管理项目介绍 技术选型 Vue2 0 Elemenu ui 项目功能介绍 账户信息模块 菜单权限 角色权限设置 角色权限分配 账号设置 公司分组 考试管理模块 新增 编辑 删除考试试题 成绩查看 阅卷评分 成绩记录 成绩导出 题
  • 毕业设计 STM32单片机智能WiFi天气助手 - 物联网 单片机

    文章目录 0 前言 1 设计内容 2 软件设计 3 关键代码 4 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老
  • 【数据结构】冒泡排序、快速排序(递归,非递归)、归并排序(递归,非递归),七大排序比较,

    文章目录 冒泡排序 快速排序 归并排序 七大排序之间的对比 冒泡排序 基本思想 所谓交换 就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 交换排序的特点是 将键值较大的记录向序列的尾部移动 键值较小的记录向序列的前部移动
  • 一、Go基础知识入门

    1 go语言介绍 2 go开发环境搭建 2 1 go的安装 go下载地址 All releases The Go Programming Language windows选择下载go1 20 2 windows amd64 msi文件 双击
  • python join_join与python实现列合并

    在linux下powerpath对盘与更改盘符名 篇中提到了修改聚合后的多路径别名的问题 在数据库RAC增加存储盘的过程中 还会涉及一个常见的问题是多个RAC之间进行盘符名核对的问题 这里还是以三节点RAC 加 EMC存储盘为例 安装EMC