awk是Linux环境下重要的结构化文本处理工具,非常便捷好用。
之前我一直使用 Python 来处理 Linux 的一些文本,但是对于一些大文本的简单处理,Python 麻烦而且慢,于是现在慢慢改用awk来处理,很多时候一行命令就能解决,因此非常方便。针对使用是过程的一些心得,写个小小的教程,awk太强大了,需要慢慢长时间的学习,我尽量保持更新这个教程吧。
awk基本概念
awk是基于列的处理工具,它的工作方式是按行读取文本并视为一条记录,每条记录以字段分割成若干字段,然后输出各字段的值。awk认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,“空白字符”包括空格、tab、连续的空格和tab等,因此awk特别适合用于csv文件的处理。
域(字段)
- awk中每个非空白的部分叫做域(或者字段),从左到右依次是第一个域,第二个域。1,1,1,2表示第一域第二个域,$0表示全部域,也就是整行。
- 打印第一个和第四个列:
awk '{print $1,$4}' awk.txt
- 打印全部内容:
awk '{print $0}' awk.txt
$NF
表示最后一列,$(NF-1)
倒数第二列,依次类推
- 打印最后一列:
awk '{print $NF}' awk.txt
分割符
作为csv文件处理工具,分隔符对于awk非常重要,根据输入和输出、域间和行间,共有4个分隔符变量:
分割域 | 分割行 | |
输入 | FS | RS |
输出 | OFS | ORS |
- RS和ORS默认是换行(’\n’)
- FS和OFS默认是空白符
这地方要注意,我们常用-F来制定输入的域分隔符,却忘记了制定输出的域分隔符,而导致经常是输入是TAB分割,保存后的文本变成了空白符分割。
通过为输入的分隔符变量制定相应分割方式,来更好的处理文本,而输出的分隔符变量则可以让我们在保存处理后的数据时更加灵活。
awk -F "\t" '{OFS="\t"} {if ($4==3) $4=5}1' test.txt
上述命令指定输入分隔符为TAB,如果第4个字段为3,则将其替换为5,然后打印出来({}后跟1表示打印),打印的域分隔符为TAB