Linux文本处理神器awk实战案例

Posted herosunly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文本处理神器awk实战案例相关的知识,希望对你有一定的参考价值。

1. 什么是awk

  AWK是为文本处理专门打造的领域指定语言,通常用作数据提取和数据报告。它和sed、grep的功能是类似的,能够进行过滤,并且它们三者是大多数Linux系统的标准工具。

  20世纪70年代,AWK诞生于贝尔实验室。它的名字起源于三个作者姓的首字母。AWK语言是一种数据驱动的语言,它是由对文本流的一系列操作组成的,不仅能够对文件进行操作,也能够对管道进行操作,最终能够提取或者处理文本,例如产生格式化的报告。AWK广泛使用字符串类型,关联数组和正则表达式。

2. 打印不同列的内容

2.1 初探数据文件

  首先,data.txt是awk工具的输入文件,其内容如下所示,其中第一列是材质,第二列是重量,第三列是发行年,第四列是发行国,最后一列是古币的名称:

gold 1 1908 Austria-Hungary Franz josef 100 Korona
gold 1 1985 Canada Maple leaf
silver 10 1981 USA ingot
gold 1 1983 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 1 1986 USA American Eagle
silver 1 1986 USA Liberty dollar
silver 1 1986 USA Liberty 50-cent piece
gold 0.25 1986 USA Liberty 5-dollar piece
silver 1 1987 USA Constitution dollar
gold 0.1 1986 PRC Panda
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1984 Switzerland ingot

  其中最后一列的数据包括不定长个空格,这往往是文本处理的一个难点。

2.2 awk处理的三种模式

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

2.3 打印全部内容

  如何使用awk打印文件全部内容呢?

awk '{print}' data.txt

在这里插入图片描述
  但是上述命令和cat data.txt是等价的,如图所示:
在这里插入图片描述

2.4 打印第N列内容

  打印第一列内容的代码如下所示:

awk '{print $1}' data.txt

在这里插入图片描述
  打印第N列,只需把$1中1改成N即可,比如第三列:

awk '{print $3}' data.txt

在这里插入图片描述

2.5 打印多列内容

  上一小节讲的是打印某一行的内容,如果学过Python,往往会联想是否存在切片操作,即能否取出多列内容。

  同时取出前三列的命令如下所示:

awk '{print $1, $2, $3}' data.txt

在这里插入图片描述

2.6 打印多列内容并对齐显示

  可通过在每一列中添加制表符(TAB)来进行对齐,需要注意的是在awk命令内需要使用字符或者字符串用双引号进行表示:

awk '{print $1 "\\t" $2 "\\t" $3}' data.txt

在这里插入图片描述

2.7 第0列的物理意义

  其中第0列表示的是所有行,而不是所有列,如下所示:

awk '{print $0}' data.txt

在这里插入图片描述

3. 打印行号和列号

  行号指的是位于第几行,而列号指的是这一行一共包含了几列。

3.1 列与列中间的分隔符

  首先假设字符串1为s1,字符串2为s2,

  • 空格:表示将字符串进行拼接,即s1+s2
  • 逗号:表示通过空格进行拼接,即s1+空格+s2
  • 制表符:表示通过TAB进行连接,即s1+TAB+s2

3.2 打印行号

  将行号和原有列通过空格进行拼接:

awk '{print NR, $0}' data.txt

在这里插入图片描述
  将行号和原有列通过TAB进行拼接:

awk '{print NR "\\t" $0}' data.txt

在这里插入图片描述

3.3 打印列号

  由于在awk中,每个分隔符将两列数据分隔开。比如一行中包括了多个空格,则表示该行出现了多列数据,这就会导致不同行对应的列数是不一致的,打印每一行对应的列号代码如下所示:

awk '{print NF, $0}' data.txt

在这里插入图片描述

3.4 利用列号打印倒数第N列

  打印最后一列直接用$NF,具体代码为:

awk 'print {$NF}' data.txt

在这里插入图片描述
  所以打印倒数第N列,使用$(NF-N-1)即可。例如倒数第二列是$(NF-1)

awk '{print $(NF-1)}' data.txt

在这里插入图片描述

3.5 打印最后一行

awk 'END {print NR, $0}' data.txt

在这里插入图片描述

4. 修改输入和输出分隔符

  默认的输入和输出分隔符都是空格。假如输入文件为csv文件,那么就需要更改输入分隔符为逗号。

  如果使用默认分隔符的话,就无法进行分列,也就是说整个数据仅仅只有一列:
在这里插入图片描述

  • 输入分隔符:FS

  对输入分隔符进行修改的代码如下所示:

awk 'BEGIN{FS=","} {print $1, $2}' time_name_score.csv

在这里插入图片描述

  • 输出分隔符:OFS

  对输入和输出分隔符同时进行修改的代码如下所示:

 awk 'BEGIN{FS=","; OFS="\\t"} {print $1, $2}' time_name_score.csv

在这里插入图片描述

5. 输入多个文件

  直接把多个文件名依次排列在最后,需要注意的是把不同文件按照行进行拼接的:

awk '{print NR, $0}' data.txt data2.txt

在这里插入图片描述

6. 修改某一列的值

  有时将某一列的值统一修改的需求,具体代码如下所示:

awk '$1 = 'silver'; {print $0}' data.txt

在这里插入图片描述

7. 条件筛选后打印

  • 筛选并打印材质为银的所有古币的命令如下:
awk '$1=="silver" {print $0}' data.txt

在这里插入图片描述

  • 筛选并打印出品年为1987年的所有古币的命令如下:
awk '$3==1987 {print $0}' data.txt

在这里插入图片描述

  • 打印第7行
awk 'NR==7 {print $0}' data.txt
  • 打印列数为7的所有行
awk 'NF==7 {print $0}' data.txt

8. 运算

8.1 数学运算

  输入以下命令后,请再按一个回车,从而得到执行结果,得到结果后按Ctrl+C后退出即可:

  • 加法:awk ‘{a=1; b=2; print a+b}’
  • 减法:awk ‘{a=1; b=2; print a-b}’
  • 乘法:awk ‘{a=1; b=2; print a*b}’
  • 除法:awk ‘{a=1; b=2; print a/b}’
  • 取余:awk ‘{a=1; b=2; print a%b}’

8.2 字符串拼接

  字符串拼接:awk ‘{a=1; b=2; print a b}’
在这里插入图片描述

8.3 两者混合运算

  字符串拼接时,可以通过括号进行表示,拼接后再进行数学运算,如下所示:

awk '{a=1; b=2; c=3; print (a b)+c}'

在这里插入图片描述
  如果字符串中的开头是数字,则可以直接和数字进行运算,否则认为字符串代表的数字为0(即使是字符串的中部出现了数字也一样)。
在这里插入图片描述
在这里插入图片描述

9. 正则表达式

  通过/正则表达式/来进行文本搜索。比如文本中包括字符串com,则搜索表达式为:

awk '/com/{print $0}' data.txt

在这里插入图片描述

以上是关于Linux文本处理神器awk实战案例的主要内容,如果未能解决你的问题,请参考以下文章

讲清楚,说明白!Linux从业人员必备工具--AWK文本处理利器实战

文本处理利器Linux Awk这样入门☛常见变量的使用

文本处理工具AWK简单用法案例

打开高效文本编辑之门_Linux awk之关联数组

打开高效文本编辑之门_Linux Awk自定义变量与操作符

linux文本处理三剑客的学习