AWK入门到精通系列——awk快速入门

2023-11-09

简介

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )

一个简单的例子

#创建一个文件
vim awk.txt
Beth 4.00 0
Dan  3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
字段解释: 姓名  每小时工资  工作时长

#打印每位员工的名字以及报酬
awk '$3>0 {print $1,$2*$3}' awk.txt
$3>0 是模式
print $1,$2*$3是动作
#想知道哪些员工在偷懒
awk '$3==0 {print $1}' awk.txt

执行结果图:

AWK程序结构 

  • AWK程序执行流程
  awk的基本操作是在由输入行组成的序列中, 陆续地扫描每一行, 搜索可以被"模式"匹配(match) 的行.如果匹配则执行"动作",一直持续到所有的输入被读取完毕
  •  模式-动作分析
(1)模式-动作都存在 awk '$3==0 {print $1}' awk.txt
(2)模式存在,动作不存在 awk '$3==0' awk.txt
(3)模式不存在,动作存在 awk '{print $1}' awk.txt
(4)不可以两者都不存在(不能够运行)

AWK命令的运行格式

#后面接文件
awk '$3==0 {print $1}' awk.txt  后面接一个文件
awk '$3==0 {print $1}' awk.txt awk02.txt  后面接两个文件
#等待输入
awk '$3==0 {print $1}' 后面不接任何文件,等待输入再去判断
#将awk程序放入文件中
 cat program
 $3==0 {print $1}
 执行命令: awk -f program awk.txt

 AWK的输出格式

  • 数据类型​
  • ​数字和字符串
  • 行和字段
awk从它的输入中每次读取一行,将行分解为一个个的字段(默认将字段看作是非空白字符组成的序列).
当前输入行的第一个字段叫作$1,第二个是$2,依次类推,一整行记为$0,每行的字段数有可能不一样.
  •  案例
#打印每一行
awk '{print}' awk.txt 或 awk '{print $0}' awk.txt
#打印某些字段
awk '{print $1,$3}' awk.txt
#打印每行的字段数量(内建变量NF)
awk '{print NF}' awk.txt
#打印第一个字段和最后一个字段
awk '{print $1,$NF}' awk.txt
#计算和打印
awk '{print $1,$2 * $3}' awk.txt
#打印行号(NR)
awk '{print NR,$0}' awk.txt
#拼接字符串和字段
awk '{print $1,"今天的收入是",$2 * $3}' awk.txt
#格式化输出
awk '{ printf("%s 今天的收入是 $%.2f\n",$1,$2*$3) }' awk.txt
固定宽度输出
awk '{ printf("%-8s 今天的收入是 $%6.2f\n",$1,$2*$3) }' awk.txt
输出排序
awk '{ printf("%6.2f,%-8s 今天的收入是 $%6.2f\n",$2*$3,$1,$2*$3) }' awk.txt |sort -nk3 -t,

 AWK模式匹配

  •  单模式
#每小时工资大于5的记录
awk '$2>5 {print $0}' awk.txt
#报酬超过50的员工
awk '$2*$3>50 {print $1,$2*$3}' awk.txt
#查询名字为Mark的记录
awk '$1=="Mark" {print $0}' awk.txt
#正则表达式匹配名字带有Mar的记录
awk '/Mar/ {print $0}' awk.txt
  •  模式组合 
#打印那些$2至少为4,或者$3至少为20的行
awk '$2>=4||$3>=20 {print $0}' awk.txt
awk '!($2<4&&$3<20) {print $0}' awk.txt
#打印那些$2至少为4,并且$3至少为20的行
awk '$2>=4 && $3>=20 {print $0}' awk.txt
  •  BEGIN 与 END
特殊的模式 BEGIN 在第一个输入文件的第一行之前被匹配, END 在最后一个输入文件的最后一行被处理之后匹配.
awk 'BEGIN {*********} END{***********}'
awk 'BEGIN {print "NAME  RATE   HOURS"} {print} END{print "END"}' awk.txt
awk 'BEGIN {print "NAME  RATE   HOURS";print "------"} {print} END{print "------";print "END"}' awk.txt

 用AWK计算

  • 计算总和

 #工作时长超过15小时的员工总人数
awk '$3>15 {emp=emp+1} END{print emp,"工作时长超过15小时的员工人数"}' awk.txt

  •  计算平均数

 #计算员工的平均工资
awk '{pay=pay+$2*$3} END{print NR,"员工总人数";print "总工资",pay; print "平均工资",pay/NR}' awk.txt

  •  查找最大值

 #查找每小时工资最高的员工
awk '$2 >maxrate {maxrate=$2;maxemp=$1} END{print "每小时工资最高的员工是:",maxemp,"工资是:",maxrate}' awk.txt

  •  打印最后一行

 awk '{last=$0} END{print last}' awk.txt

 字符串拼接

#name之间加一个空格
awk '{names=names $1 " "} END{print names}' awk.txt

 

 内建函数

 #length 求字符串长度
计算名字的长度
awk '{print $1,length($1)}' awk.txt

#计算文本的行数,总字段数,总字节数
awk '{nc=nc+length($0)+1;nw=nw+NF} END{print NR,"lines,",nw,"words,",nc,"characters"}' awk.txt

 流程控制语句

  • if-else语句

 #查找每小时工资多于 $6.00 的雇员的总报酬与平均报酬
awk '$2>6 {n=n+1;pay=pay+$2*$3} END{if(n>0) print n,"employees,total pay is",pay,"average pay is",pay/n;else print "not exit"}' awk.txt

  •  while语句

 计算1到100总和
awk 'BEGIN{ test=100; total=0; while(i<=test) { total+=i; i++; } print total; }' 5050

#shell脚本
#!/bin/bash
total=0
i=0
while [ $i -le 100 ]
do
let total+=$i
let i++
done
echo $total

  •  for语句

 #计算1到100的总和
awk 'BEGIN{ total=0; for(i=0;i<=100;i++) { total+=i; } print total; }'

  •  数组

 #倒着打印每行记录
awk '{line[NR] = $0} END {i=NR; while (i>0){ print line[i];i=i-1}}' awk.txt
awk '{line[NR] = $0} END{for(i=NR;i>0;i--){print line[i]}}' awk.txt

 AWK 生产案例

 #输入的总行数
awk 'END{print NR}' awk.txt
#打印第2行
awk 'NR==2 {print $0}' awk.txt
#打印每行最后一个字段
awk '{print $NF}' awk.txt
#打印最后一行最后一个字段
awk '{field=$NF} END{print field}' awk.txt
#打印字段数多于 2 个的输入行
awk 'NF>2 {print $0}' awk.txt
#打印最后一个字段值大于 4 的输入行
awk '$NF>4{print $0}' awk.txt

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

AWK入门到精通系列——awk快速入门 的相关文章

  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • 为什么使用signalfd无法捕获SIGSEGV?

    我的系统是ubuntu 12 04 我将示例修改为man 2 signalfd 并添加sigaddset mask SIGSEGV 在示例中 但我无法得到输出SIGSEGV被生成 这是一个错误吗glibc 源代码片段如下 sigemptys
  • 使用 sed 将反斜杠替换为斜杠[重复]

    这个问题在这里已经有答案了 我需要更换 with 我有一个文件 其中包含 test test2 test3 test4 I tried VRS Ruta cat ruta lst sed s g sed s g output test te
  • 命名互斥体的 Mono 替代方案

    在 Windows NET 上 命名的互斥体可用于同步多个进程 不幸的是 Mono 在 Linux 上不太支持这一点 他们的发行说明 http www mono project com Release Notes Mono 2 8 Shar
  • 如何在 Linux 中向热敏打印机发送 ESC/POS 命令

    我正在尝试在热敏打印机上发送 ESC POS 命令 但每当我发送它们时 热敏打印机都会将它们打印为文本 而不是作为命令执行它们 我在 prn 文件中编写这些命令 每当我执行 lp 命令来打印文件时 这些 prn 文件也会被打印 但作为文本
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 将 apache documentRoot 设置为符号链接(以便于部署)

    我们正在寻找一种将 Apache DocumentRoot 指向符号链接的方法 例如 文档根目录 var www html finalbuild Finalbuild 应该指向 home user build3 之类的文件夹 当我们将新构建
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • Shell 执行:时间与 /usr/bin/time

    当 bash zsh 执行以下操作时会发生什么 usr bin time l sleep 1 1 00 real 0 00 user 0 00 sys 516096 maximum resident set size 0 average s
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015

随机推荐

  • data must not be longer than 256 bytes

    1 问题 在进行 RSA 解密时候报错 data must not be longer than 256 bytes 2 分析 RSA加解密算法通常有两种不同的方式 是使用对称密钥 比如 AES DES等加解密方法 加密数据 然后使用非对称
  • JSP简单练习-一个简单的计数器

    在JSP中 在 之间书写的程序代码成为java程序片 一个JSP页面中可以有多个java程序片 要注意的是 在Java程序片中声明的变量在它们所在JSP页面的所用程序片及表达式中都有效 基于此 可以把一个较大的程序片分成几个小的程序片 还可
  • python 作图中的图标题title 和坐标轴标签的axes的调整

    这里主要是调整title和坐标轴标签的样式 要注意抓住设定的套路和规律 不要被复杂的外表所迷惑 import matplotlib pyplot as plt import numpy as np from matplotlib impor
  • C# HttpWebRequest 获取 HTTPS 网页内容

    在 C 中 可以使用 HttpWebRequest 类来获取 HTTPS 网页内容 需要注意的是 HTTPS 网页采用了 SSL TLS 加密传输机制 必须在发送请求之前获取服务器端的证书并进行验证才能成功获取网页内容 下面是一份示例代码
  • js--纯js实现省市地区三级联动

    QQ自己的JS省市区三级联动 已验证 使用引用外部JS来实现三级联动的 JS如下 http ip qq com js geo js
  • CPU是如何工作的

    晶体管到门电路 二极管的工作 相信大家都知道二极管的工作特性 那如何使用二极管去构建一个门电路呢 二极管的与门 上拉电阻 只有AB同时为高电平 输出为高电平 二极管的或门 下拉电阻 只要AB任一一个为高电平 输出为高电平 MOS管的工作 在
  • 初学React,制作案例页面1

    通过node搭建开发环境 先下载node并安装 然后在cmd中用npm命令下载react脚手架 我选择了react bootstrap作为UI框架 所以也在cmd中下载react bootstrap资源包 npm install g cre
  • C++ - 成员函数(member function)模板(template) 详解 及 代码

    成员函数 member function 模板 template 详解 及 代码 本文地址 http blog csdn net caroline wendy article details 16918085 成员模板 member tem
  • Flink Table API 与 Flink SQL 实现Kafka To Kafka 版本1.12

    Table API版本 0 前提 1 创建流和表执行环境 2 连接Source并创建Table 3 筛选Table对象中的数据 4 连接Sink并创建临时表 5 将Table对象写入临时表 测试 杠精打住 SQL 版本 最近有铁汁问我 一闪
  • leetcode 第 1025 题:除数博弈(C++)

    1025 除数博弈 力扣 LeetCode 第一反应是动态规划 f i 是否为true取决于在 0 i 之间能否找到一个因数j使得f i j 为false 也就是能否找到一个因数使得鲍勃必败 class Solution public bo
  • poj 3074 Sudoku

    Time Limit 1000MS Memory Limit 65536K Total Submissions 7613 Accepted 2696 Description In the game of Sudoku you are giv
  • ST官方库函数之GPIO复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解

    通常我们需要对ST单片机的整个IO进行复位操作 这是我们可以用到复位函数void GPIO DeInit GPIO TypeDef GPIOx 先来看一下这个函数的定义 void GPIO DeInit GPIO TypeDef GPIOx
  • JUST技术:时空轨迹挖掘助力物流小哥减负增效

    电商的发展需要依赖高效而可靠的物流服务 如何通过大数据和人工智能技术提升物流小哥的配送效率是我们一直在深入研究的问题 在刚刚结束的数据挖掘顶会KDD2020中 这篇 Doing in One Go Delivery Time Inferen
  • 31岁拿了阿里P6的offer,还有必要去吗?

    前几天看到一个非常现实且扎心的提问 31岁拿了阿里P6的offer 要去吗 首先给大家简单普及一下 估计很多小伙伴对阿里P6的概念比较模糊 甚至不少人觉得阿里P几啊什么的 就都很牛b 其实不然 P级只是阿里现行的职级划分体系 校招生进入阿里
  • sbt入门

    sbt入门 sbt 介绍 sbt 下载 sbt 安装 sbt 入门 helloworld sbt 目录结构 sbt 命令 总结 sbt 介绍 sbt是什么 sbt到底是什么 在网上找找 似乎找不到一个非常准确 而且大家都认可的定义 我自己对
  • FASTJSON和JACKSON基本使用

    Json是一种轻量级的数据交换格式 采用一种 键 值 对的文本格式来存储和表示数据 在系统交换数据过程中常常被使用 是一种理想的数据交换语言 在使用Java做Web开发时 不可避免的会遇到Json的使用 JSON形式与语法 JSON对象 我
  • linux使用xe命令管理远程xenserver机器

    1 linux下安装xe工具 xenserver6 2的dom0是32位centos5系统 xenserver6 5是64位centos系统 xe工具都是以rpm包形式提供 在ubuntu下安装时 先要用alien转换rpm包为deb包 注
  • group by的使用场景

    group by的使用场景 自我理解 一般配合sum使用 用来分组统计总 量 面试的时候最好说我们当时用的group 加sum查询每个sku的销量 group by 分组 查询 就是把记录集中的记录按一定规则进行 分组统计 假设一个学生名单
  • Android 关于inflate

    通俗的说 inflate就相当于将一个xml中定义的布局找出来 因为在一个Activity里如果直接用findViewById 的话 对应的是setConentView 的那个layout里的组件 因此如果你的Activity里如果用到别的
  • AWK入门到精通系列——awk快速入门

    简介 AWK是一个优良的文本处理工具 Linux及Unix环境中现有的功能最强大的数据处理引擎之一 这种编程及数据操作语言 其名称得自于它的创始人阿尔佛雷德 艾侯 彼得 温伯格和布莱恩 柯林汉姓氏的首个字母 的最大功能取决于一个人所拥有的知