2023-01-30 awk入门及进阶

回顾:

grep:文本过滤器  

        grep 'pattern' input_file ...

sed:流编辑器

       sed 'COMMAN/PATTERN/'

awk: 报告生成器,格式化以后,显示

 a.k.a. Aho, kernighan and Weinberger

在linux中是gawk

# awk [options] 'script' file1 file2, ...

# awk [options] 'PATTERN {action}' file1 file2, ...(action中有多个语句要用;隔开)

    print, printf

$0表示一整行

如果N是一行的最后一个字段,$N引用的时候自带了末尾的换行符(实践得出的)

-F 指定分隔符

OFS=”pattern" 指定输出分隔符


一、print

print的使用格式:print item1,item2,...可随处插入“文本”

\n:换行符,行分隔符是换行符


二、awk变量

2.1 awk内置变量之记录变量:

FS:field separator,读取文本时,所使用的字段分隔符,默认是空白字符

RS: Row separator,输入文本信息所使用的换行符,默认是换行符;

OFS:Output field Separator

ORS:Output Row Seperator

2.2 awk内置变量之数据变量:

NR:The number of input records, awk命令处理过的行数,如果有多个文件,这个数目会把处理的多个文件中行统一计数;

NF:Number of field,当前记录的field个数

FNR:与NR不同,FNR用于记录正处理的行是当前这一文件中被总共处理的行数

2.3 用户自定义变量

gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母,数字和下划线,且不能以数字开头。gwak变量名称区分字符大小写。

awk中第一次引用一个变量,且没有赋值的话, 默认值为0

2.3.1 在脚本中赋值变量

在gwak中给变量赋值使用赋值语句进行,例如:

awk 'BEGIN{var(变量名)="variable testing(赋予变量的值)";print var}'

2.3.2 在命令行中使用赋值变量

gwak命令也可以在“脚本”(即打括号内)外为变量赋值,并在脚本中进行引用。

awk -v var="variable testing" 'BEGIN{print var}'

在awk中,打印变量值是不需要加$的,加$的表示第几个字段

awk不带文件的话只需要用BEGIN


三、printf

printf命令的使用格式:

printf format,item1,item2,...

1.需要指定format

2.format用于指定后面的每个item的输出格式

3.printf语句不会自动打印换行符:\n 想换行的话要带上

format格式的指示符都以%开头,后跟一个字符:如下:

%c:显示字符的ASCⅡ码;

%d,%i:十进制整数

%e,%E:科学计数法显示数值;

%f:显示浮点数;

%g,%G:以科学计数法的格式或浮点数的格式显示数值;

%s:显示字符串;

%u:无符号整数;

%%:显示%自身;

修饰符:N:显示宽度;(如%10s,显示10个字符串)

              -:左对齐(不使用的时候默认右对齐)(%10s是“         s”,%-10s是“s          ”)

              +:显示数值符号;


四,awk操作符

4.1算术操作符:

-x:负值

+x:转换为数值

x^y

x**y:次方

x*y:乘法

x/y:除法

x+y:

x-y:

x%y;

4.2赋值操作符

=   +=(将加的结果赋给变量)    -=(将减的结果赋给变量)    *=(将乘的结果赋给变量)   /=(将除的结果赋给变量)   %=(将取模的结果赋给变量)   ^=(将取幂的结果赋给变量)   **=(将取幂的结果赋给变量)

++(递增操作符)    --(递减操作符)   

递增和递减操作符可以出现在操作数的任何一边,位置不同可以得到不同的计算结果。

++x 在返回结果前递增x的值(前缀)

x++ 在返回结果后递增x的值(后缀)

4.3布尔值

awk中,任何非0值或非空字符串都为真,反之就为假;

4.4比较操作符

<小于

<=小于等于

>大于

>=大于等于

==等于(一个=是赋值)

!=不等于

x ~ y (x是字符串,y是正则表达式模式,如果x能被y指定的模式匹配到则为真,否则则为假)

x !~ y 与上相反

subscript in array 在array数组中有对应的元素则为真,否则为假

4.5表达式间的逻辑关系符:

&& 逻辑与

||    逻辑或

4.6 条件表达式

selector?if-true-exp;if-false-exp(简化版的两分支if语句)

意思是 if selector;then

               if-true-exp

           else

                if-false-exp

           fi


五,awk的模式

5.1 常见的PATTERN类型

1.regexp:正则表达式,格式为/regular expression/

2.expression:表达式,其值为0或为非空字符时满足条件,用运算符~(匹配)和~!(不匹配)

$锚定行尾

3.Ranges:指定的匹配范围,格式为pat1,pat2

4.BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次

# awk 'BEGIN{action}{action}END{action}' file

5.empty(空模式):匹配任意输入行

5.2 常见的Action

1.Expressions;

2.Control statements

3.Compound statements

4.Input/Output statments


六,控制语句

6.1 if-else

语法:if (condition) {then-body} else {[else-body]}

6.2 while(循环字段)

语法:while(condition){statement1;statement2;...}

6.3 do-while

语法:do{statement1,statement2,...}while(condition)

6.4 for

语法:for (variable assignment; condition; interation process) {statement1,statement2,...}

6.5 case

语法:switch(expression) {case VALUE or /REGEXP/: statement1, statement2, ...default: statement1, ...}

6.6 break和continue(提前处理下一个字段)

常用于循环或case语句中

6.7 next

提前结束对本行文本的处理,并接着处理下一行


七,awk中使用数组

数组名[数组下标] (初始值是0)

下标可以是数字,也可以是字符串

输出数组内的数据用for循环,for(A(任意起一个变量名)in array){print A, array[A]} 输出数组内所有下标及对应的值


八.awk的内置函数

length([string]):返回string字符串中字符的个数\


例子 :

1.awk '(NR%2)==1{print}'  #输出奇数行

需要把几行合并,经常用到方法是:NR%num 然后将行值保存下来,next该行。在输出时候打印出来。

next:表示直接读取下一行而不执行其余语句

2.按a.txt文件的第二列匹配b.txt文件的第一列并输出所有b.txt文件中匹配的行

# awk 'NR==FNR{arr[$2];next}$1 in arr' a.txt b.txt

解释:当NR==FNR时(注意是双等号,单等号意味着赋值),即处理总行等于当前文本处理行数时,即处理第一个文本a.txt时,将$2以下标的形式存储在arr数组中,然后next读取下一行,不执行其他语句;

当NR不等于FNR时(在本例中即NR>FNR时),即处理第二个文本时,检索如果$1处在在arr数组中(下标也可以检索),则默认输出整行(省略了{print $0}).

从而实现以a.txt为依据筛选b.txt中匹配的数据。

3.选择几个文件中第一列重复的行并输出。

cat A B C|cut -f1|sort -n|uniq -c|grep " n"

4.linux实现将文本文件每一行中相同第一列对应的其他列进行拼接

sort file.txt|uniq|awk '{a[$1]=(a[$1]","$2);} END{for(i in a) print i "\t"a[i]}'

sed -i 's/\t,/\t/' file.txt

首先sort test|uniq实现对test文件的去重,保留不同的行;

awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}' 表示的含义是: 将每一行的第一列最为数组a的key,第二列作为a的value,同时碰到相同的key,就把其值进行拼接,linux的shell的字符串拼接形式为str = (str  “ ” $var),最后遍历数组a,其中i为数组a的每一个key,a[i]为key对应的值;

sed -i 's/\t,/\t/' file.txt   是为了删除第二列第一个“,”

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容

  • 1.awk介绍  awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出 有...
    尛尛大尹阅读 322评论 0 0
  • 参考文章:https://www.cnblogs.com/along21/p/10366886.html#重要!参...
    一只烟酒僧阅读 373评论 0 2
  • 1、awk 1.1 认识awk awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以...
    莫讠阅读 884评论 0 7
  • AWK是一种处理文本文件的语言,也是一个强大的文本分析工具。AWK最早是在1977年在贝尔实验室被发明的,之所以叫...
    AlgoPeek阅读 806评论 0 1
  • Linux文本处理工具三剑客: grep:文本过滤器 sed:流编辑器 awk:报告生成器(格式化以后,显示) a...
    溺水的漂流瓶阅读 525评论 1 1