awk高级处理

linux: awk 超高频使用方法 Top 10

sed处理行好用,awk处理列好用的。

awk 简介

awk 是一种流式文本处理工具,用于从文本文件中提取、处理和格式化数据。它的名称来源于三位创始人的姓氏首字母 Aho、Weinberger 和 Kernighan。awk 在 Unix 和类 Unix 操作系统中非常常见,被广泛用于文本处理、数据提取、格式化输出等任务。它可以通过命令行或脚本文件进行调用。

awk 的基本工作方式是逐行读取输入文本,然后根据用户提供的模式(匹配条件)和动作(操作)对文本进行处理。每行文本都会被分割成一个个字段,字段之间的分隔符可以通过 -F 选项进行指定,默认为空格或制表符。

以下是 awk 的基本用法和特性:

  • 模式-动作结构: awk 使用模式-动作结构来指定要执行的操作。模式用于匹配行,动作则是在模式匹配的情况下执行的操作。

  • 默认动作: 如果没有指定动作,默认动作是打印整行。

  • 变量: awk 内置了一些特定变量,例如 $0 表示整行文本,$1 表示第一个字段,NF 表示字段数等。

  • 条件判断: 可以使用条件语句(例如 if)对行进行筛选和处理。

  • 计算和聚合: 可以使用变量进行计算、聚合和累积操作。

  • 字符串拼接和格式化输出: 可以使用字符串拼接和 printf 函数进行格式化输出。

  • 正则表达式: 可以在模式中使用正则表达式进行模式匹配。

  • BEGIN 和 END 块: 可以在处理之前(BEGIN)和处理结束之后(END)执行特定的操作。

  • 自定义分隔符: 使用 -F 选项指定分隔符,或者使用 -v 选项定义输出分隔符(OFS)。

  • 多文件处理: awk 可以同时处理多个输入文件。

  • 管道使用: 可以将其他命令的输出作为 awk 的输入进行处理。

  • 灵活性: awk 非常灵活,可以用于各种文本处理任务,从简单的数据提取到复杂的格式转换和报告生成。

以下是一个简单的示例,展示了如何使用 awk 提取并格式化数据:

# 假设 input.txt 包含以下内容
# Name Age
# Alice 25
# Bob 30
# Carol 28

# 打印第1列和第2列,并在输出中添加 "Person: " 前缀
awk '{print "Person:", $1, "is", $2, "years old."}' input.txt

在实际应用中,awk 可以根据不同的需求进行更复杂的处理,包括数据清洗、转换、报告生成等。

再来看一下awk 和sed 异同

awk(Aho, Weinberger, Kernighan)和 sed(Stream Editor)都是在 Unix 和类 Unix 系统中使用的文本处理工具,它们都是用于处理文本流的工具,但在功能和用法上有一些区别和共同点。

共同点:

  1. 文本处理: 两者都用于对文本进行处理,从输入流中读取文本行,根据模式匹配执行相应的操作。
  2. 命令行工具: awk 和 sed 都是命令行工具,可以直接在终端使用,也可以结合管道和重定向进行复杂的文本处理。

区别:

  1. 功能差异:

    • sed 主要用于对文本进行流式编辑,常用于查找、替换、删除等简单的操作,它基于行进行处理。
    • awk 则更强大,除了流式编辑外,还可以进行数据提取、计算、格式化、条件筛选、聚合等复杂操作。它基于字段进行处理,适用于结构化数据的处理。
  2. 数据处理方式:

    • sed 是一种基于行的文本编辑工具,它逐行读取文本并根据模式进行操作。它的主要用途是文本转换和编辑。
    • awk 是一种基于字段的文本处理工具,它将每行文本分解成字段,并可以对字段进行访问、操作和计算。它的主要用途是数据提取和分析。
  3. 处理灵活性:

    • awk 比 sed 更灵活,可以进行更复杂的逻辑和计算操作,特别适用于处理结构化数据。
    • sed 更适合于简单的查找、替换和编辑操作,对于复杂数据处理可能需要结合其他工具。
  4. 语法和变量:

    • awk 使用更丰富的语法,支持条件语句、循环、函数等,还有一些内置变量用于处理数据。
    • sed 语法相对较简单,主要用于查找和替换。

综上所述,awk 和 sed 都是强大的文本处理工具,但在使用时需要根据具体的需求来选择。如果仅需要简单的查找、替换和编辑操作,可以使用 sed,如果需要对结构化数据进行提取、分析和计算,应该选择 awk。常见的做法是在处理文本时,根据任务的复杂程度选择合适的工具或结合使用两者。

awk 超高频使用的方法 Top 10

  1. 引用shell 变量:使用 -v 来引用变量:

    fruit=apple
    awk -v var="$fruit"  '{print $1 "\t" var}' $a.sample.list
  2. 打印特定列:使用$n来表示第 n 列,例如打印第2列:

    awk '{print $2}' input.txt
  3. 条件筛选:使用条件语句进行行的筛选和处理,例如只打印第3列大于10的行:

    awk '$3 > 10 {print}' input.txt
  4. 多个条件的逻辑操作:使用逻辑操作符 &&(与)和 ||(或)结合多个条件,例如打印第2列大于5且第3列小于10的行:

    awk '$2 > 5 && $3 < 10 {print}' input.txt
  5. 自定义分隔符:使用 -F 选项指定分隔符,例如以冒号为分隔符提取第2列:

    awk -F':' '{print $2}' input.txt
  6. 计算和聚合:使用变量进行计算和聚合操作,例如计算第2列的总和:

    awk '{sum += $2} END {print sum}' input.txt
    # 想要给每一列都加1000,snp上下1k。
    # awk 引用shell 变量也可以给变量添加单引号和双引号
    pos=1000
    awk '{print $1, $2-"'$pos'",$2+"'$pos'"}' input.txt
  7. 字符串拼接:使用 "" 将字符串和变量拼接起来,例如打印第1列和第3列:

    awk '{print $1 " " $3}' input.txt
    awk '{print $1 "\t" $3}' input.txt #就是中间加一个tab
    awk '{print $1 "and" $3}' input.txt #中间 加 and 可以修改为你任何想要的东西
  8. 模式匹配和正则表达式:在条件中使用正则表达式进行模式匹配,例如匹配包含 "apple" 的行:

    awk '/apple/ {print}' input.txt
  9. 多个文件处理:可以同时处理多个文件,例如将多个文件的第1列合并为一个文件:

    awk '{print $1}' file1.txt file2.txt > output.txt
  10. BEGIN 和 END 块:awk 允许在处理之前(BEGIN)和处理结束之后(END)执行特定的操作,例如计算文件行数:

    awk 'BEGIN {count = 0} {count++} END {print "Total lines: " count}' input.txt
    # 在比如给文件添加 一行备注
    awk 'BEGIN{print "#本文章由国靓亲情编辑更多有趣有用有点厉害的内容敬请关注公众号国靓的文案" }{print $0} ' 

这些只是awk的一些常见用法,awk非常灵活,可以用于各种文本处理任务,包括数据提取、格式化、统计、报告生成等。根据具体的需求,可以结合awk的各种功能和特性来实现更复杂的操作。

下期预告

sed处理行好用,awk处理列好用的,再整一期正则表达式和grep的结合起来,文本处理基本拿捏🤌,再再整一篇循环和条件控制妥妥的能写一个自动化脚本啊,大噶也不用较劲必须都记住,知道这些工具都能干啥就行了,用到了再百度或者问问chatGTP就完了,真实案例中实践一下就记住了,不可能只用一次吧,多用几次就通透了。还要不要再写一篇cut啊,其实,他能干的sed和awk都能干,只是他的命令行比较简洁。

国靓的文案

主要分享:1:基于R语言、python和linux的数据分析,数据可视化及生物信息分析;2:零基础学英语从How are you开始学;3:运动健康。(能量是守恒的,喜欢是互相的,关注我,世界上就多了一个爱你的人!)

​这小子模仿我的内容出视频快去看看咋样!

图片

凌晨更新,欢迎提问!

点个小赞鼓励我一下子再走呗!​

葛靓

赞赏二维码喜欢作者

人喜欢

收录于合集 #linux
 7
上一篇linux: sed超高频使用的方法 Top 10下一篇linux:cut 简单易懂且高效的列 提取、切割命令
阅读 1206
诸葛靓的文案
 
 
关注后可发消息
 
 
posted @ 2023-08-25 10:09  往事已成昨天  阅读(33)  评论(0编辑  收藏  举报