文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python实现类似awk的简单功能

2023-01-31 07:35

关注

命令行的awk很方便,但处理灵活一点的话对awk不熟,深入学习又没太大必要,用python做个简单的,复杂的话也用python脚本实现,程序的一致性更好。

#!/usr/bin/python
#coding:utf-8

import os
import sys
from getopt import getopt

#处理协程
def deallines(dealer,instream,paras):
    sep = paras.get("sep","\t")
    for line in instream:
        fields = line.strip("\r\n").split(sep)
        for result in dealer(line,fields) or ():
            if type(result) == str:
                yield result
            elif type(result) == int:
                yield str(result)+"\n"
            else:
                yield sep.join([str(f) for f in result])+"\n"

#定义处理函数
dealerid = 0
def definedealer(dealstr,paras):
    global dealerid
    dealerid += 1
    funcname = "dealer_"+str(dealerid)
    exec "def "+funcname+"(line,f): "+dealstr
    return vars()[funcname]

#打印结果
def printer(instream):
    for line in instream:
        print line,

#处理字符转义
def convertchar(s):
    if s == "\\t":
        return "\t"
    elif s == "\\r":
        return "\r"
    elif s == "\\n":
        return "\n"
    elif s == "\\\\":
        return "\\"
    elif s == "\\'":
        return "\'"
    elif s == '\\"':
        return '\"'
    elif s == "\\a":
        return "\a"
    elif s == "\\b":
        return "\b"
    elif s == "\\e":
        return "\e"
    elif s == "\\v":
        return "\v"
    elif s == "\\f":
        return "\f"
    elif len(s) == 4 and s.startswith("\\x"):
        return chr(eval('0x'+s[2:4]))
    else:
        return s

#转换参数
def convertparas(paras):
    result = {"sep":"\t"}
    for key,value in paras:
        if key == '-F':
            result["sep"] = convertchar(value)
    return result
<pre name="code" class="python"><pre name="code" class="python">

FNR = 0def record(instream): global FNR for r in instream: FNR += 1 yield r
#主函数def main(args): paras,deals = getopt(args[1:],'F:') paras = convertparas(paras) dealers = [definedealer(dealstr,paras) for dealstr in deals] stream = record(sys.stdin) for dealer in dealers: stream = deallines(dealer,stream,paras) printer(stream)if __name__
 =='__main__': main(sys.argv)

#输入数据,姓名 年龄 身高 体重

cat person.txt
zs      10      1.3     35.0

ls      12      1.4     36.0

#print直接输出

cat person.txt | dealline 'print line,'

zs      10      1.3     35.0

ls      12      1.4     36.0

#分两步,第一步提取姓名 身高 体重,第二步计算体重指数=体重/身高/身高

cat person.txt | dealline 'yield f[0],f[2],f[3]' 'yield f[0],float(f[2])/float(f[1])/float(f[1])'
zs      20.7100591716
ls      18.3673469388

注:-F分隔符缺省为\t,line为整行,f为按分隔符split后的数组,FNR为记录号

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯