awk 内置变量与自定义变量


    
    
    点击上方“
 
     
     
     生信科技爱好者
 
     
     
     ”,马上关注

    
    
    真爱,请置顶或星标

    
    
    

6b5cf8d3-b7f1-4803-8bfc-5de3b9a83c44.jpg

作者:ghostwu

原文:https://www.cnblogs.com/ghostwu/p/9085653.html

AWK 中,变量分为两种:内置变量与自定义变量。

内置变量

常见的内置变量有:

  • FS:输入字段分隔符, 默认为空白字符;

  • OFS:输出字段分隔符, 默认为空白字符;

  • RS:输入记录分隔符(输入换行符), 指定输入时的换行符;

  • ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符;

  • NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量;

  • NR:行号,当前处理的文本行的行号;

  • FNR:各文件分别计数的行号;

  • FILENAME:当前文件名;

  • ARGC:命令行参数的个数;

  • ARGV:数组,保存的是命令行所给定的各参数。


1. NF 打印字段数

下面的 NF 打印出每行有多少列。

$ awk '{print NF}' ghostwu.txt 
2
$ cat ghostwu.txt 
ghostwu
zhangsan 22
lisi 23 woman



2. 引用 NF 变量

引用 NF 变量,需要用美元符号。

$ cat ghostwu.txt 
ghostwu 20 man
zhangsan 22 woman
lisi 23 woman
$ awk '{print $NF}' ghostwu.txt 
man
woman
woman
$ awk '{print $(NF-2), $(NF-1), $(NF)}' ghostwu.txt 
ghostwu 20 man
zhangsan 22 woman
lisi 23 woman



3. NR 打印行号

使用 NR 打印每一行的行号:

$ awk '{print NR,$0}' ghostwu.txt 
1 ghostwu 20 man
2 zhangsan 22 woman
3 lisi 23 woman



4. NR 与 FNR

awk 支持多文件扫描,如果采用 NR,下一个文件的行序号会接着上一个文件;如果使用 FNR,就会单独统计。

$ awk '{print NR, $0}' ghostwu.txt ghostwu.bak 
ghostwu 20 man
zhangsan 22 woman
lisi 23 woman
ghostwu 20 man
zhangsan 22 woman
lisi 23 woman
$ awk '{print FNR, $0}' ghostwu.txt ghostwu.bak 
ghostwu 20 man
zhangsan 22 woman
lisi 23 woman
ghostwu 20 man
zhangsan 22 woman
lisi 23 woman



5. RS 指定行分隔符

RS 指定行输入符,默认为回车换行,如果我们想让它以空格作为行输入符( 即,遇到空格就换行 ),当我们指定使用空格作为"行分隔符"时,在 awk 解析文本时,每当遇到空格,awk 就认为遇到的空格是换行符,于是 awk 就将文本换行了。

$ awk '{print NR, $0}' ghostwu.txt 
ghostwu 20 man
zhangsan 22 woman
lisi 23 woman
$ awk -v RS=" " '{print NR, $0}' ghostwu.txt
ghostwu
20
man
zhangsan
22
woman
lisi
23
woman



6. ORS 指定输出行分隔符

ghostwu@dev:~/linux/awk$ awk -v ORS='---->' '{print $0}' ghostwu.txt 
ghostwu 20 man---->zhangsan 22 woman---->lisi 23 woman---->ghostwu@dev:~/linux/awk$ 



7. 同时指定输入,输出行分隔符

$ awk -v RS=" " -v ORS='->' '{print $0}' ghostwu.txt
ghostwu->20->man
zhangsan->22->woman
lisi->23->woman



8. 使用 FILENAME 打印文件名称

$ awk '{print FILENAME, NR, $0}' ghostwu.txt ghostwu.bak
ghostwu.txt 1 ghostwu 20 man
ghostwu.txt 2 zhangsan 22 woman
ghostwu.txt 3 lisi 23 woman
ghostwu.bak 4 ghostwu 20 man
ghostwu.bak 5 zhangsan 22 woman
ghostwu.bak 6 lisi 23 woman



9. ARGV 保存命令行参数的数组

ARGV 保存命令行参数的数组,'pattern{action}'并不被看做参数。

$ awk '{print ARGV[0], ARGV[1], ARGV[2]}' ghostwu.txt 
awk ghostwu.txt 
awk ghostwu.txt 
awk ghostwu.txt 



10. ARGC 保存命令行参数个数

使用 ARGC 可以保存命令行参数的个数,下例中ARGV[1]没有值,因为命令行没有给第三个参数。

$ awk '{print ARGV[0], ARGV[1], ARGV[2], ARGC}' ghostwu.txt 
awk ghostwu.txt  2
awk ghostwu.txt  2
awk ghostwu.txt  2


自定义变量

awk 常见的用户自己定义的变量,有两种形式:通过 -v 变量名的形式,和在 program 中直接定义。

1. -v varname=value

使用-v varname=value的形式自定义变量时, 变量名区分字符大小写。

$ awk -v my_name="hello world" 'BEGIN{print my_name}'
hello world



2. 在 program 中直接定义变量

在 program 中直接定义变量时,以下定义了3个自定义变量,其实形式像编程语言一样,定义的时候用分号。打印变量跟之前一样,用逗号隔开,注意,不需要用美元符号。

$ awk 'BEGIN{ my_name="zhangsan"; my_age=22; my_sex="男"; print my_name, my_age, my_sex}'
zhangsan 22 男



3. 引用命令行定义的变量

除了 1、2 的自定义变量方式外,我们也可以引用命令行定义的变量。

echo $myvar

$ myvar="我在命令行定义的变量"
$ awk -v var1=$myvar 'BEGIN{print var1}'
我在命令行定义的变量


413c118e-90b2-4a1b-8d1e-7d637f671665.png — END—


声明:本公众号所有转载的文章仅用于参考学习使用,文章包括文字与图片在内的著作权属于原作者所有,禁止用于商用。文章任何形式的转载请联系原作者获得授权。

54811691-771d-473a-a0a0-12df59312c26.png


565bc6fb-5284-4290-be8d-8b2e1a1c1416.gif 戳原文,更有料!

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

posted @ 2020-06-01 16:00  章鱼猫先生  阅读(263)  评论(0编辑  收藏  举报