Awk学习手册【附leetcode刷题实战】

发布于:2025-02-10 ⋅ 阅读:(37) ⋅ 点赞:(0)

前言:linux环境准备

因为学习的时候是windows环境,没有linux环境很不方便。找到一个在线的linux环境分享给大家。

同时也为豆包的AI产品点赞。

免费在线linux环境参考:Linux 在线练习 | 菜鸟教程

AWK的基本结构

awk -option 'pattern {action}' file.txt

第一章 内置变量

  • $0:当前行的完整内容。

  • $1, $2, ...:当前行的第1个字段、第2个字段等。

  • NF:当前行的字段数。

  • NR:当前行号(从1开始)。

  • FS:字段分隔符,默认为空白字符(空格或制表符)。

  • OFS:输出字段分隔符,默认为空白字符。

  • ORS:输出记录分隔符,默认为换行符。

Built-in Variables (The GNU Awk User’s Guide)

练习题目:输出文件中第10行内容

195. 第十行 - 力扣(LeetCode)

awk 'NR==10' file.txt

第二章 模式

2.1 整行查找模式

查找文件中以begin开头,end结尾的行数据。

awk '/^begin end$/' file.txt

示例代码

cat employee.txt

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 
awk '/manager/{print $0}' employee.txt

ajay manager account 45000
varun manager sales 50000
amit manager account 47000 

 区间查找。查找文件中begin1开头的数据行至end2结尾的数据行。

awk '/^begin1/,/end2$/' file.txt

示例代码:查找manager开始,到clerk结束的行数据。

awk '/manager/,/clerk/' employee.txt

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000

2.2 列数据查找

awk '$1 ~ /^begin end$/' file.txt

查找第一列中满足正则式条件的所有行数据。

示例代码:查找第一列中名字为varun的行数据。

awk '$1 ~ /varun/' employee.txt   

varun manager sales 50000

练习:193. 有效电话号码 - 力扣(LeetCode)

awk '/^(\([0-9]{3}\) [0-9]{3}\-[0-9]{4}|[0-9]{3}\-[0-9]{3}\-[0-9]{4})$/' file.txt

说明:本题目在marscode在线linux环境中测试容易得到错误的结果,所以在windows环境下还是建议安装真实的linux环境。

使用Windows Subsystem for Linux运行,请移步文章:

Win11安装基于WSL2的Ubuntu - charlee44 - 博客园

第三章 动作

3.1 单个动作

awk '/pattern/{print $1,$2}' file.txt

对满足正则式条件的行执行{action}操作。

 3.2 多个动作

awk 'NR == 1 {print $0} NR == 2 {print $0}' file.txt  # 打印前两行

3.3 初始化和结尾动作

BEGIN块

  • BEGIN 块在awk开始处理任何输入之前执行。
  • 通常用于初始化变量、打印表头信息,或者执行需要在读取实际数据前完成的操作。
  • 示例用法:
    BEGIN {
      print "Processing started at:", systime()
      FS = ","    # 设置字段分隔符
      OFS = "\t"  # 设置输出字段分隔符
    }

awk的BEGIN和END块-阿里云开发者社区

END块

  • END 块在awk处理完所有输入行之后执行。
  • 它常用来做最终的计算(如统计总数)、汇总输出或者在所有处理完成后进行操作。
  • 示例用法:
    NR > 0 { sum += $3 }  # 对第三列求和(假设每一行都有第三列)
    END {
      print "Total sum of third column:", sum
      print "Number of processed lines:", NR
    }

结合上述示例,在一个完整的awk脚本中,BEGIN块首先执行,然后逐行处理输入数据,最后执行END块。这为编写预处理和后处理逻辑提供了一种方便的方式。 

awk的BEGIN和END块-阿里云开发者社区

awk 'BEGIN {print "Start"} {print $0} END {print "End"}' file.txt

练习题目:192. 统计词频 - 力扣(LeetCode)

awk '{
    for (i=1; i<=NF; i++)
        words[$i] = words[$i] + 1
}
END{
    for (word in words)
        print word,words[word]
}' words.txt | sort -rn -k 2

第四章 数组

awk中数组本质存储的是key=value对数据,所以key可以不连续,与Java里的map比较类似。

4.1 判断key是否在数据中存在

判断数组中key是否存在使用表达式 indx in array 返回值true/false来确定。

Reference to Elements (The GNU Awk User’s Guide)

4.2 遍历数组

Scanning an Array (The GNU Awk User’s Guide)

4.3 删除数组中元素

Delete (The GNU Awk User’s Guide)

 练习题目:194. 转置文件 - 力扣(LeetCode)

# Read from the file file.txt and print its transposed content to stdout.
awk '{
    for (i=1; i<=NF; i++)
        if (NR==1)
            cols[i] = $i
        else
            cols[i] = cols[i] " " $i
}
END{
    for (var in cols)
        print cols[var]
}
' file.txt

参考资料


网站公告

今日签到

点亮在社区的每一天
去签到