diff --git "a/04 \351\231\210\346\235\260/20240603 awk\345\221\275\344\273\244.md" "b/04 \351\231\210\346\235\260/20240603 awk\345\221\275\344\273\244.md" new file mode 100644 index 0000000000000000000000000000000000000000..c5b0fa44db3f7e4359aad31fca66bd62fafe5285 --- /dev/null +++ "b/04 \351\231\210\346\235\260/20240603 awk\345\221\275\344\273\244.md" @@ -0,0 +1,49 @@ +# 笔记 + +AWK命令行书写由BEGEN Program END三部分构成 + +BEGEN:在AWK读取输入流文本行处理之前执行,用于初始化变量、定义输出表头信息 + +Program:定义如何处理读的数据,由两部分构成:pattern{action statements;..},由模式和动作构成,匹配模式则执行动作。 + +END在文件逐行处理完成后执行END语句,用于统计结果、生成报告处理流程: + +AWK将处理对象视为二维表逐行读取逐行处理,默认以空白符作为分隔符(可以使用 -F指定分隔符),将文件内容分隔为多个域(可以理解为列或字段),一行称为一条记录,每条记录由多个字段构成。这些行与列被映射成了AWK的内置变量(可以通过-v选项自定义变量),因此用户就可以通过这些内置变量来定位处理对象中的内容进行处理,简单理解为:基于行读取、基于列进行处理并输出。 + +## 语法 + +```bash +awk [options] 'program' var=value file… +awk [options] -f programfile var=value file… +awk [options] 'BEGIN{action;… }pattern{action;… }END{action;… }' file ... +# 每个语句块都有 +``` + +## 常用选项 + +-F "分隔符" 用于指定读取输入流文本行中用到的字段分隔符,如果不指则默认以空白符为分隔符,并自动压缩连续的多个空白符视为一个空白符。 +-f file 从指定文件中读取通用语句块 +-v var=value 用于变量赋值 + +## 内置变量 + +AWK将处理对象视为二维表逐行读取,逐行处理,一行为一条记录,一列为个字段,行与列被映射成了AWK的内置变量,所以用户才可以像处理二维表格一样处理数据。因此AWK的常用内置变量也就以行和列的维度就进行定义。 +行列维度内置变量: AWK将读入的文本行以指定分隔符分割为多个列,分别映射为内置变量$1,$2,$3...$n,即$1代表第1列,$2代表第2列,以此类推。注意:$0代表所有列,如果语句块中没有定义action动作则默认动作为print $0,即打印所有列。 + +NF:代表被分隔的字段数,即列数 + +NR: 一行为一条记录 + +AWK处理输入流时可以用-F选项指定分隔符,但一定会满足用户的使用需求,例:在打印输出时,打印输入时用的分隔符,就需要手动指定很麻烦,AWK同样想到了用户的这一需求,提供了分隔符相关的内置变量。AWK的处理流程就是输入流处理后生成输出流,所以分隔符也就有了输入分隔符、输出分隔符。 + +记住几个单词: + +F:Field + +O:output + +S:Separated + +FS:输入分隔符 + +OFS:输出分隔符 \ No newline at end of file