命令行工具:awk文本处理

awk

一个强大的工具,可以同时处理行和列,好多C语言内置函数可以集成进来,非常灵活。基本模式是awk 'BEGIN{print "start"} pattern {commands} END {print "end"} file',其中BEGIN和END可选,就是开始执行真正的循环之前和之后执行的操作。

简介

有几个特殊的变量:

  • NR:number of current row,当前行号;
  • NF:number of fields,总共有多少个字段,默认是按空格分字段的;
  • $0:当前行段内容;
  • $1:第一个字段的内容

执行逻辑是:

  • 执行BEGIN块里命令
  • 读取一行内容(文件或stdin),匹配模式,若匹配成功,执行commands;匹配不成功,不执行;如果没有模式,默认都执行;重复这一步
  • 执行END块里命令

下面还是以student.csv为例:

name

gender

score

grade

David

male

85

B

Michael

female

90

A

Cammy

male

88

A

Tom

female

59

C

Cookbook

简单常见操作:

  • awk '{print $1}' student.csv:打印第一个字段,默认空格分割
  • awk '/Tom/ {print $2}' student.csv:若该行包含Tom,打印第二列,默认空格分割
  • awk -F ',' '{print $NF}' student.csv:打印最后一列,指定是按逗号分隔
  • awk '{s+=$3} END {print s}' student.csv:计算第三列的和,如果没有表头的话
  • awk 'BEGIN {getline; print $0} {s+=$3} END {print s}' student.csv:getline跳过第一行,尤其是CSV文件
  • awk 'END{print NR}' student.csv:统计有几行
计算一列和

awk -F"," 'BEGIN {getline} {s+=$3} END {print s}' student.csv结果算出score列和为322。

其中-F","告诉awk用逗号分隔;BEGIN里的get line告诉awk跳过第一行;后面每次循环加上第三列的值,结果就是求个sum。

计算某列最大值

awk -F"," 'BEGIN{getline} max < $3 {max = $3} END{print max}' student.csv得出结果90。

同样开始的时候,跳过第一行;max < $3是一个条件判断,如果遇到更大的值,将其赋给max,如果没有,继续;最后打印最大值。

awk -F"," 'BEGIN{getline} max < $3 {max = $3; maxline=$0} END{print maxline }' student.csv可以打印最大值这一行。

交换两列值

awk -F"," 'BEGIN{OFS=","} {tmp=$3; $3=$4; $4=tmp; print $0}' student.csv结果如下:

name

gender

grade

score

David

male

B

85

Michael

female

A

90

Cammy

male

A

88

Tom

female

C

59

其中BEGIN模块里先指定Output Field Separator,默认的是空格,可以重新指定为逗号;后面建立一个临时变量,然后交换第三四列;打印交换后的行。

给加一个列id

awk 'BEGIN {getline; print "id," $0} {print NR-1 "," $0}' student.csv

id

name

gender

score

grade

1

David

male

85

B

2

Michael

female

90

A

3

Cammy

male

88

A

4

Tom

female

59

C

第一行的时候,直接加id即可;其他行,利用NR变量自动加,同时用变量$0保留原来行数据。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员同行者

django模型

每个字段有一些特有的参数,例如,CharField(和它的派生类)需要max_length 参数来指定 VARCHAR 数据库字段的大小

912
来自专栏鸿的学习笔记

records包源码解析

核心类有三个 Record, RecordCollection, Database。在做源码分析时,先从入口类Database开始:

882
来自专栏佳爷的后花媛

php统计查询,实时更新

在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩,用户的银行卡张数等等,ThinkPHP为这些统...

4793
来自专栏Python小屋

Pandas创建DataFrame对象的几种常用方法

DataFrame是pandas常用的数据类型之一,表示带标签的可变二维表格。本文介绍如何创建DataFrame对象,后面会陆续介绍DataFrame对象的用法...

4678
来自专栏Danny的专栏

【SSH快速进阶】——Hibernate继承映射:每个具体类映射一张表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1124
来自专栏Web 开发

做wordpress CMS必须用到的强力代码(转)

这个代码很强力,做一个wordpress cms的索引页面(index.php) 这个代码是必须要会使用,不然会走很多弯路。

1092
来自专栏深度学习那些事儿

探讨pytorch中nn.Module与nn.autograd.Function的backward()函数

本文讲解基于pytorch0.4.0版本,如不清楚版本信息请看这里。backward()在pytorch中是一个经常出现的函数,我们一般会在更新loss的时候使...

2714
来自专栏锦小年的博客

python学习笔记6.7-简化数据结构的初始化过程

我们每编写一个类的时候都需要编写一个初始化函数,那么如果编写的类当做数据结构来用,它们的初始化结构就是一样的,例如: class Stock: def ...

2166
来自专栏申龙斌的程序人生

零基础学编程018:条件语句

学习了《零基础学编程017:画出我的公众号LOGO》之后,可以用几行代码,画出一个螺旋渐开线。 from turtle import * for i in r...

3546
来自专栏Jed的技术阶梯

Hive窗口函数01-SUM、MIN、MAX、AVG

order by : 在同一个组内,先累加完相同createtime的pv,再累加其他createtime的pv, 比如 : 现在在表末尾加一条数据cooki...

3743

扫码关注云+社区

领取腾讯云代金券