AWK 入门教程:强大的文本处理工具

AWK 是一种强大的文本处理工具,广泛用于 Linux/Unix 系统中对文本文件或数据流进行操作。它能够基于条件筛选、统计字段、重新排列数据等。主要特点包括:

2. AWK 的基本语法

2.1 AWK 程序的结构

AWK 程序的结构:

awk 'pattern { action }' file

2.2 常用内置变量

变量含义
NR当前处理的行号
FNR当前文件的行号(处理多个文件时的相对行号)
NF当前行的字段数(列数)
2第 1 列、第 2 列的值
$NF当前行的最后一列值
FS输入字段分隔符(默认为空格)
OFS输出字段分隔符(默认空格)
RS输入记录分隔符(默认为换行符)
ORS输出记录分隔符(默认为换行符)
ARGIND当前处理的文件在命令行参数中的索引
ARGC命令行参数的数量
ENVIRON存储当前环境变量的关联数组
FILENAME当前正在处理的文件名
SUBSEP数组下标分隔符(默认为 \034
RSTARTmatch 函数匹配字符串的起始位置
RLENGTHmatch 函数匹配字符串的长度

以下是 常用内置变量 的补充说明,以 Markdown 格式输出:

变量说明:
2.3 运行 AWK 程序

AWK 程序可以通过以下方式运行:

注意事项

  • • 未指定文件时,AWK 从标准输入读取数据;

  • • 可同时处理多个文件;

2.4 基本输出

2.5 高级输出

printf 格式化输出

printf 可以格式化输出内容,例如:

awk '{ printf "Name: %s, Age: %d\n", $1, $2 }' file.txt
排序输出

结合 sort 命令对输出进行排序:

awk '{ print $1 }' file.txt | sort

2.6 选择/过滤行

按某列的值
按某几列值的计算结果
按字符串匹配
不同方式的组合
BEGIN 和 END

2.7 计算

统计数量:工时超过 15 小时的员工人数
awk '$3 > 15 { count++ } END { print count }' file.txt
求和、求平均:平均工资
awk '{ sum += $2 } END { print "Average:", sum/NR }' file.txt
处理文本:打印时薪最高的员工信息
awk '$4 > max { max = $4; line = $0 } END { print line }' file.txt
字符串拼接(concatenation):在一行内打印所有员工名
awk '{ names = names $1 " " } END { print names }' file.txt
打印最后一行
awk '{ last = $0 } END { print last }' file.txt
内置函数

2.8 控制流

If-Else
awk '{ if ($1 > 50) print "High"; else print "Low" }' file.txt
While
awk '{ i = 1; while (i <= NF) { print $i; i++ } }' file.txt
For
awk '{ for (i = 1; i <= NF; i++) print $i }' file.txt

2.9 数组

统计每列的总和:
awk '{ for (i = 1; i <= NF; i++) sum[i] += $i } END { for (i in sum) print "Column", i, "Sum:", sum[i] }' file.txt

3. AWK 示例速查表

以下是常见 AWK 功能及其对应程序和类似命令:

编号功能AWK 程序类似命令
1打印总行数END { print NR }wc -l
2打印第 10 行NR == 10 { print }sed -n '10p'
3打印最后一列{ print $NF }
4打印最后一行的最后一列{ f = $NF } END { print f }tail -n1
5打印有 4 列以上的行NF > 4 { print }
6打印最后一列的值大于 4 的行$NF > 4 { print }
7打印所有输入的总字段数{ nf += NF } END { print nf }
8打印包含关键字的总行数/keyword/ { n++ } END { print n }grep -c 'keyword'
9打印第 1 列的最大值及对应的行$1 > max { max = $1; line = $0 } END { print max, line }
10打印列数大于 1 的行NF > 1 { print }
11打印长度大于 80 的行length($0) > 80 { print }
12打印每行的列数和该行内容{ print NF, $0 }
13打印第 2 列和第 1 列{ print $2, $1 }
14交换第 1 列和第 2 列{ t = $1; $1 = $2; $2 = t; print }
15第 1 列替换为行号{ $1 = NR; print }
16删除第 2 列并打印{ $2 = ""; print }
17倒序打印每行的字段{ for (i=NF; i>0; i--) printf "%s ", $i; printf "\n" }
18计算每行的字段和{ sum=0; for (i=1; i<=NF; i++) sum += $i; print sum }
19计算所有字段的总和{ for (i=1; i<=NF; i++) sum += $i } END { print sum }
20将所有字段取绝对值并打印{ for (i=1; i<=NF; i++) if ($i<0) $i = -$i; print }
    • • 基于模式匹配: 根据条件筛选数据。

    • • 列操作能力: 简单高效地处理文本列数据。

    • • 轻量编程语言: 提供内置变量、循环、条件语句等编程功能。

    • 相关资料

      《AWK 编程语言》:

    • https://github.com/wuzhouhui/awk/blob/twoside/The_AWK_Programming_Language_zh_CN.pdf

    • • pattern: 指定操作的匹配规则,例如正则表达式、逻辑判断等。

    • • action: 指满足条件时要执行的操作,用 {} 包围,例如打印、统计、替换等。

    • • file: 要处理的文本文件名称。

    1. NR 和 FNR 的区别

      • • NR:累计行号,处理多个文件时行号会累加。

      • • FNR:当前文件的行号,处理多个文件时每个文件的行号从 1 开始重新计数。

    2. FS 和 OFS 的作用

      • • FS:指定输入字段的分隔符,默认是空格。

      • • OFS:指定输出字段的分隔符,默认是空格。

    3. RS 和 ORS 的作用

      • • RS:指定输入记录的分隔符,默认是换行符。

      • • ORS:指定输出记录的分隔符,默认是换行符。

    4.  ENVIRON 的使用

      • • ENVIRON 是一个关联数组,用于访问环境变量。例如:

        awk 'BEGIN { print ENVIRON["HOME"] }'
    5. RSTART 和 RLENGTH

      • • 这两个变量与 match 函数配合使用,用于获取匹配字符串的起始位置和长度。例如:

        awk 'BEGIN { str = "hello world"; match(str, /world/); print RSTART, RLENGTH }'
    6. SUBSEP

      • • 用于多维数组的下标分隔符,默认是 \034(非打印字符)。例如:

        awk 'BEGIN { arr["a", "b"] = 10; print arr["a", "b"] }'
    7. ARGIND 和 ARGC

      • • ARGIND:当前处理的文件在命令行参数中的索引(从 1 开始)。

      • • ARGC:命令行参数的数量。例如:

        awk 'BEGIN { print ARGIND, ARGC }' file1.txt file2.txt
    8. FILENAME

      • • 当前正在处理的文件名。例如:

        awk '{ print FILENAME, $0 }' file1.txt file2.txt
    9. 2, ..., $NF

      • • $1 表示第 1 列,$2 表示第 2 列,依此类推。

      • • $NF 表示当前行的最后一列。

    10. NF

      • • 当前行的字段数(列数)。例如:

        awk '{ print NF }' file.txt
    11. RS 和 ORS 的高级用法

      • • 可以修改 RS 和 ORS 来处理非标准格式的文件。例如,将 RS 设置为空字符串,以处理多行记录:

        awk 'BEGIN { RS = "" } { print $0 }' file.txt
    12. SUBSEP 的高级用法

      • • 可以修改 SUBSEP 来定义多维数组的下标分隔符。例如:

        awk 'BEGIN { SUBSEP = ":"; arr["a", "b"] = 10; print arr["a", "b"] }'
    13. RSTART 和 RLENGTH 的高级用法

      • • 结合 match 函数,可以提取匹配的子字符串。例如:

        awk 'BEGIN { str = "hello world"; match(str, /world/); print substr(str, RSTART, RLENGTH) }'
    14. ENVIRON 的高级用法

      • • 可以遍历 ENVIRON 数组,打印所有环境变量。例如:

        awk 'BEGIN { for (key in ENVIRON) print key, ENVIRON[key] }'
    15.  FILENAME 的高级用法

      • • 在处理多个文件时,可以根据文件名执行不同的操作。例如:

        awk '{ if (FILENAME == "file1.txt") print "File1:", $0; else print "File2:", $0 }' file1.txt file2.txt
    1. 命令行直接运行

      awk 'pattern { action }' file
      • • pattern:匹配条件(可选)。

      • • action:满足条件时执行的操作。

      • • file:要处理的文件。

    2. 脚本文件运行

      awk -f script.awk file

      示例:假设 script.awk 内容如下:

      { print $1 }

      运行命令:

      awk -f script.awk file.txt
      • • script.awk:包含 AWK 程序的脚本文件。

      • • file:要处理的文件。

    • • 打印文件的所有内容:

      awk '{ print $0 }' file.txt
    • • 打印文件的第 1 列和第 3 列:

      awk '{ print $1, $3 }' file.txt
    • • 打印第 2 列大于 50 的行:

      awk '$2 > 50 { print }' file.txt
    • • 打印第 1 列和第 2 列之和大于 100 的行:

      awk '$1 + $2 > 100 { print }' file.txt
    • • 打印包含 "error" 的行:

      awk '/error/ { print }' file.txt
    • • 打印第 2 列大于 50 且包含 "error" 的行:

      awk '$2 > 50 && /error/ { print }' file.txt
    • • BEGIN 块在处理输入前执行,END 块在处理输入后执行:

      awk 'BEGIN { print "Start" } { print } END { print "End" }' file.txt
    • • 统计行数、单词数、字符数:

      awk '{ chars += length($0); words += NF } END { print "Lines:", NR, "Words:", words, "Chars:", chars }' file.txt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/73241.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/73241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql select distinct 和 group by 哪个效率高

在有索引的情况下&#xff0c;SELECT DISTINCT和GROUP BY的效率相同&#xff1b;在没有索引的情况下&#xff0c;SELECT DISTINCT的效率高于GROUP BY‌。这是因为SELECT DISTINCT和GROUP BY都会进行分组操作&#xff0c;但GROUP BY可能会进行排序&#xff0c;触发filesort&…

使用conda将python环境打包,移植到另一个linux服务器项目中

问题&#xff1a;因为新的服务器A不能联网&#xff0c;导致离线pip install包耗时耗力&#xff0c;旧的服务器B中的Anaconda和A中是同一个版本&#xff0c;有现成的python环境&#xff0c;并且服务器B可以联网&#xff0c;现想将B中的环境&#xff0c;直接移植到A中使用。 解决…

晶晨S905M/晶晨S905L2芯片-原机安卓4升级安卓7.1.2-通刷线刷固件包

晶晨S905M&#xff0f;晶晨S905L2芯片-原机安卓4升级安卓7.1.2-通刷线刷固件包 线刷方法&#xff1a;&#xff08;新手参考借鉴一下&#xff09; 1、准备好一根双公头USB线刷刷机线&#xff0c;长度30-50CM长度最佳&#xff0c;同时准备一台电脑&#xff1b; 2、电脑上安装好…

KICK第四讲Linux 系统下安装 GCC 编译器全指南

Linux 系统下安装 GCC 编译器全指南 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 系统下最常用的编译器之一&#xff0c;支持 C/C、Java 等多种编程语言。本文将介绍不同 Linux 发行版下的安装方法&#xff0c;帮助开发者快速配置开发环境。 一、使用包管理…

Django系列教程(8)——函数视图及通用类视图

目录 什么是视图(View)及其工作原理 接近现实的函数视图 更复杂的案例: 视图处理用户提交的数据 基于函数的视图和基于类的视图 Django通用类视图 a. ListView b. DetailView c. CreateView d. UpdateView e. FormView f. DeleteView 小结 Django的视图(view)是处理…

c# 查找相似颜色算法

下是一个基于欧几里得距离的C#颜色相似度查找算法实现,包含详细注释和优化策略: using System; using System.Collections.Generic;public class ColorMatcher {// 颜色容器 - 使用字典存储颜色ID到RGB的映射private readonly Dictionary<int, byte[]> _colorDictiona…

【A2DP】蓝牙音频编解码器互操作性要求详解

目录 一、音频编解码器互操作性&#xff1a;核心要点总览 二、必选与可选编解码器互操作性要求大盘点 2.1 必选与可选的编解码器支持 2.2 必选编解码器要求 2.3 可选编解码器要求 2.4 厂商自定义&#xff08;Vendor Specific&#xff09;A2DP编解码器互操作性要求 2.5 不…

electron 设置跨域iframe

在 Electron 的主进程中禁用同源策略 在 Electron 的主进程文件中添加 app.commandLine.appendSwitch("disable-site-isolation-trials"); 来禁用站点隔离试验。在创建 BrowserWindow 时&#xff0c;设置 webPreferences 的 webSecurity: false 来禁用同源策略。

c-线程创建,同步互斥,互斥锁;

文章目录 案例描述1代码实现代码解释 案例背景2代码实现代码解析关键概念总结扩展练习 案例描述1 我们将模拟一个简单的售票系统&#xff0c;其中有两个售票窗口同时出售100张票。为了确保不会卖出超过100张票&#xff0c;并且不会出现卖票时的竞态条件&#xff08;race condi…

SpringBoot第二天

目录 1.Web开发 1.1简介 1.2SpringBoot对静态资源的映射规则 1.3模板引擎 1.3.1引入thymeleaf&#xff1b; 1.3.2Thymeleaf语法 1.3.2.1标准表达式语法 1.变量表达式 1.3.2.2表达式支持的语法 1.3.2.3常用的thymeleaf标签 1.4Springboot整合springmvc 1.4.1Springmvc…

Redis的缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级

一、缓存雪崩&#xff1a; 1、什么是缓存雪崩&#xff1a; 如果缓在某一个时刻出现大规模的key失效&#xff0c;那么就会导致大量的请求打在了数据库上面&#xff0c;导致数据库压力巨大&#xff0c;如果在高并发的情况下&#xff0c;可能瞬间就会导致数据库宕机。这时候如果…

Html5记忆翻牌游戏开发经验分享

H5记忆翻牌游戏开发经验分享 这里写目录标题 H5记忆翻牌游戏开发经验分享前言项目概述技术要点解析1. 页面布局&#xff08;HTML CSS&#xff09;响应式设计 2. 翻牌动画效果3. 游戏逻辑实现状态管理卡片配对检测 开发技巧总结1. 模块化设计2. 性能优化3. 用户体验 踩坑经验扩…

【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search

大语言模型(LLMs)在处理复杂推理和实时信息检索时面临两大挑战:知识局限性(无法获取最新外部知识)和检索灵活性不足(传统方法依赖固定检索流程)。现有方法如检索增强生成(RAG)和工具调用(Tool-Use)存在以下问题: RAG:单轮检索导致上下文不足,无法适应多轮交互场景…

Linux网络套接字编程——创建并绑定

目录 网络字节序 socket编程接口 socket bind 如果将进程比作一个房子&#xff0c;那套接字相当于是一扇门&#xff0c;通向与外界通信的通道。 在网络中&#xff0c;如何理解套接字呢&#xff0c;时刻记住套接字是为了标识互联网中的某一台主机上的某一个进程&#xff0c…

1720. 解码异或后的数组

解码异或后的数组 题目描述尝试做法 题目描述 未知整数数组 arr 由 n 个非负整数组成。 经编码后变为长度为 n - 1 的另一个整数数组 encoded &#xff0c;其中 encoded[i] arr[i] XOR arr[i 1] 。例如&#xff0c;arr [1,0,2,1] 经编码后得到 encoded [1,2,3] 。 给你编…

了解一下HTTP的短连接和长连接

在 HTTP 协议中&#xff0c;连接的方式主要分为长连接和短连接。这两种连接方式的主要区别在于连接的生命周期和数据传输的效率。理解它们的差异对于优化 Web 应用的性能和资源利用至关重要。以下是 HTTP 长连接和短连接的详细解释。 1. 短连接&#xff08;HTTP/1.0&#xff0…

【WRF模拟】如何查看 WPS 的输入静态地理数据(二进制格式)?

查看 WPS 的输入静态地理数据方法总结 方法 1:使用 gdal_translate 将二进制数据转换为 GeoTIFFgdal_translate 工具概述使用 gdal_translate 将二进制数据转换为 GeoTIFF方法 2:使用 ncdump 查看 geo_em.dXX.nc方法 3:使用 Python xarray + matplotlib 可视化 geo_em.dXX.n…

Mybatis语法bug

select * from appointment where status ‘ACCEPTED’ and expire_time< now() idea显示now&#xff08;&#xff09;这里一直报错&#xff1a; 应为标记名称 应为 Deepseek: 根据您的代码和报错信息分析&#xff0c;这是一个 MyBatis XML 文件中的 SQL 语法问题。具体原…

DeepSeek本机部署(基于Ollama和Docker管理)

目录 一、ollama 与 docker 简介 &#xff08;一&#xff09;ollama(Ollama) &#xff08;二&#xff09;docker 二、利用 ollama 和 docker 配置 deepseek-r1 的准备工作 &#xff08;一&#xff09;硬件需求 &#xff08;二&#xff09;软件安装 三、配置 deepseek-r1…

小程序 wxml 语法 —— 39 简单双向数据绑定

在 WXML 中&#xff0c;普通属性的绑定是单向的&#xff0c;比如 <input value"{{ value }}" />&#xff0c;当数据发生改变时&#xff0c;页面也会随之发生变化&#xff0c;但是当用户在输入框中输入最新内容&#xff0c;最新内容并不会同步给 value 数据&…