(转)8个有力的Awk内建变量
8个有力的Awk内建变量
翻译原文:8 Powerful Awk Built-in Variableshttp://www.thegeekstuff.com/这个博客真是不错。
这篇文章是Awk Tutorial Examples系列的一部分。 Awk有几个非常强力的内置变量.通常来说,分为两种类型的内置变量: - 第一种是定义的变量可以改变, 比如字段分隔(FS)与记录分隔(RS) - 第二种是可以用来数据处理或者数据总结,比如记录数(NR)与字段数目(NF) 文中 介绍了:FS
,OFS
, RS
, ORS
, NR
, NR
, FNR
FS: 输入字段分隔符变量
FS
(Field Separator)读取并解析输入文件中的每一行时,默认按照空格分隔为字段变量,$1,$2...
等。FS
变量被用来设置每一记录的字段分隔符号。FS
可以是任意的字符串或者正则表达式.你可以使用下面两种方式来声名FS
:
- 使用
-F
命令选项 - 作为设置为普通变量使用
1
2
3
4
5
6
7
|
Syntax:
$ awk -F 'FS' 'commands' inputfilename
(or)
$ awk 'BEGIN{FS="FS";}'
|
- FS 可以是任意字符或者正则表达式
- FS 可以多次改变, 不过会保持不变直到被明确修改。不过如果想要改变字段分隔符, 最好是在读入文本之前就改变FS, 这样改变才会在你读入的文本生效。
下面是一个使用FS
读取/etc/passwd`以
:`作为分隔符的例子
1
2
3
4
5
6
7
8
9
10
11
|
$ cat etc_passwd.awk
BEGIN{
FS=":";
print "Name\tUserID\tGroupID\tHomeDirectory";
}
{
print $1"\t"$3"\t"$4"\t"$6;
}
END {
print NR,"Records Processed";
}
|
使用结果:
1
2
3
4
5
6
7
8
9
10
11
|
$awk -f etc_passwd.awk /etc/passwd
Name UserID GroupID HomeDirectory
gnats 41 41 /var/lib/gnats
libuuid 100 101 /var/lib/libuuid
syslog 101 102 /home/syslog
hplip 103 7 /var/run/hplip
avahi 105 111 /var/run/avahi-daemon
saned 110 116 /home/saned
pulse 111 117 /var/run/pulse
gdm 112 119 /var/lib/gdm
8 Records Processed
|
OFS: 输出字段分隔符变量
OFS
(Output Field Separator) 相当与输出上的FS
, 默认是以一个空格字符作为输出分隔符的,下面是一个OFS的例子:
1
2
3
4
5
6
7
8
9
|
$ awk -F':' '{print $3,$4;}' /etc/passwd
41 41
100 101
101 102
103 7
105 111
110 116
111 117
112 119
|
注意命令中的print
语句的,
表示的使用一个空格连接两个参数,也就是默认的OFS
的值。因此OFS
可以像下面那样插入到输出的字段之间:
1
2
3
4
5
6
7
8
9
|
$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd
41=41
100=101
101=102
103=7
105=111
110=116
111=117
112=11
|
RS: 记录分隔符
RS
(Record Separator)定义了一行记录
。读取文件时,默认将一行作为一条记录。 下面的例子以student.txt作为输入文件,记录之间用两行空行分隔,并且每条记录的每个字段用一个换行符分隔:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
$cat student.txt
Jones
2143
78
84
77
Gondrol
2321
56
58
45
RinRao
2122
38
37
65
Edwin
2537
78
67
45
Dayan
2415
30
47
20
|
然后下面的脚本就会从student.txt输出两项内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$cat student.awk
BEGIN {
RS="\n\n";
FS="\n";
}
{
print $1,$2;
}
$ awk -f student.awk student.txt
Jones 2143
Gondrol 2321
RinRao 2122
Edwin 2537
Dayan 2415
|
在student.awk
中,把每个学生的详细信息作为一条记录, 这是因为RS(记录分隔符)是被设置为两个换行符。并且因为FS(字段分隔符)是一个换行符,所以一行就是一个字段。
ORS: 输出记录分隔符变量
ORS
(Output Record Separator)顾名思义就相当与输出的RS
. 每条记录在输出时候会用分隔符隔开,看下面的 ORS的例子:
1
2
|
$ awk 'BEGIN{ORS="=";} {print;}' student-marks
Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=
|
上面的脚本,输入文件的每条记录被“=”分隔开. 附:student-marks便是上面的输出.
NR: 记录数变量
NR
(Number of Record) 表示的是已经处理过的总记录数目,或者说行号(不一定是一个文件,可能是多个)。下面的例子,NR
表示行号,在END
部分,NR
就是文件中的所有记录数目。
1
2
3
4
5
6
7
|
$ awk '{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}' student-marks
Processing Record - 1
Processing Record - 2
Processing Record - 3
Processing Record - 4
Processing Record - 5
5 Students Records are processed
|
NF:一条记录的记录数目
NF
(Number for Field)表示的是,一条记录的字段的数目. 它在判断某条记录是否所有字段都存在时非常有用。 让我们观察student-mark文件:如下:
1
2
3
4
5
6
|
$cat student-marks
Jones 2143 78 84 77
Gondrol 2321 56 58 45
RinRao 2122 38 37
Edwin 2537 78 67 45
Dayan 2415 30 47
|
接着下面的Awk程序,打印了记录数(NR),以及该记录的字段数目: 因此可以非常容易的发现那些数据丢失了。
1
2
3
4
5
6
|
$ awk '{print NR,"->",NF}' student-marks
1 -> 5
2 -> 5
3 -> 4
4 -> 5
5 -> 4
|
FILENAME: 当前输入文件的名字
FILENAME
表示当前正在输入的文件的名字. AWK可以接受读取很多个文件去处理。看下面的例子:
1
2
3
4
5
6
|
$ awk '{print FILENAME}' student-marks
student-marks
student-marks
student-marks
student-marks
student-marks
|
在输入的文件的每一条记录都会输出该名字。
FNR: 当前输入文件的记录数目
当awk读取多个文件时,NR
代表的是当前输入所有文件的全部记录数,而FNR
则是当前文件的记录数。如下面的例子:
1
2
3
4
5
6
7
8
9
10
11
|
$ awk '{print FILENAME, "FNR= ", FNR," NR= ", NR}' student-marks bookdetails
student-marks FNR= 1 NR= 1
student-marks FNR= 2 NR= 2
student-marks FNR= 3 NR= 3
student-marks FNR= 4 NR= 4
student-marks FNR= 5 NR= 5
bookdetails FNR= 1 NR= 6
bookdetails FNR= 2 NR= 7
bookdetails FNR= 3 NR= 8
bookdetails FNR= 4 NR= 9
bookdetails FNR= 5 NR= 10
|
附: bookdetails与student-marks内容一样,作例子. 可以看出来NR
与FNR
的区别。
经常使用NR
与FNR
结合来处理两个文件,比如: 有两个文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
shomy@LiuPC:awk$ cat a.txt
李四|000002
张三|000001
王五|000003
赵六|000004
shomy@LiuPC:awk$ cat b.txt
000001|10
000001|20
000002|30
000002|15
000002|45
000003|40
000003|25
000004|60
|
如果想作对应的话, 比如张三|000001|10
1
2
3
4
5
6
7
8
9
|
shomy@LiuPC:awk$ awk -F '|' 'NR == FNR{a[$2]=$1;} NR>FNR {print a[$1],"|", $0}' a.txt b.txt
张三 | 000001|10
张三 | 000001|20
李四 | 000002|30
李四 | 000002|15
李四 | 000002|45
王五 | 000003|40
王五 | 000003|25
赵六 | 000004|60
|
完
(转)8个有力的Awk内建变量的更多相关文章
- Linux 8个有力的Awk内建变量
Awk 有几个非常强力的内置变量.通常来说,分为两种类型的内置变量: 第一种是定义的变量可以改变, 比如字段分隔(FS)与记录分隔(RS) 第二种是可以用来数据处理或者数据总结,比如记录数(NR)与字 ...
- 常见的awk内建变量
FS: 输入字段分隔符变量 语法: $ awk -F 'FS' 'commands' inputfilename 或者 $ awk 'BEGIN{FS="FS";}' OFS: 输 ...
- Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1
Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1.1.1 C++内建变量(__LINE__).... 1.1.2 ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- 【转】awk内置变量
awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...
- Go内建变量类型
package main import ( "math/cmplx" "fmt" "math" ) //内建变量类型: // bool , ...
- Linux基础教程 linux awk内置变量使用介绍
awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是兄弟连Linux培训 给大家介绍的awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个 ...
- awk 内置变量
awk 内置变量 FS 设置输入域分隔符,等价于命令行 -F选项 OFS 输出域分隔符 NF 浏览记录的域的个数NR 已读的记录数RS 控制记录分隔符 ORS 输出记录分隔符 substr 截取指定的 ...
- 『忘了再学』Shell基础 — 29、AWK内置变量
目录 1.AWK内置变量 2.练习说明 (1)$n变量练习 (2)FS变量练习 (3)NF变量和NR变量练习 3.总结: 1.AWK内置变量 AWK内置变量如下表: awk内置变量 作用 $0 代表目 ...
随机推荐
- EF Power Tools使用
转载:http://blog.csdn.net/planisnothing/article/details/8532316 1.可以很方便根据数据库生成Code First模式的代码,如果是已有项目转 ...
- 「POJ 1741」Tree
题面: Tree Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define ...
- FastDFS分布式⽂文件系统
FastDFS分布式⽂文件系统 1. 什么是FastDFS FastDFS 是⽤用 c 语⾔言编写的⼀一款开源的分布式⽂文件系统.FastDFS 为互联⽹网量量身定制, 充分考虑了了冗余备份.负载均 ...
- 题解 P2350 【[HAOI2012]外星人】
题目链接 还是本宝宝写题解的一贯习惯 $ :$ 先吐槽吐槽这道题$……$ 相信不少同学第一眼一定没有看懂题.(因为我也没看懂) ~~初中~~数学知识: 对于函数 $ f(x)$ 有 $f^{-1}(x ...
- [BZOJ2879][Noi2012]美食节(费用流)
题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...
- NetworkX初相识
听说NetworkX是一个很牛的复杂网络研究的工具,就来试一下吧. import networkx as nx G= nx.Graph()#建立一个空白的图 G.add_node("node ...
- JS 方法注入 attachEvent
写法1: <html> <head> <title></title> <script language="javascript" ...
- 多线程 NSOpeartion 的使用
NSOperation简介 相对于 GCD ,具有面向对象的特征,比 GCD 更简单易用,代码可读性强 NSOperatioin 单独使用时, 不具有开辟新线程的能力, 只是同步执行操作, 需要配合 ...
- elasticsearch安装bigdest插件
bigdest下载地址:https://github.com/hlstudio/bigdesk 对于bigdest插件来说,安装是非常简单的. 只要三个步骤就可以了,下载——解压——进入到_side文 ...
- 12C GI + 11g DB 环境中PSU安装
环境说明: 12.1.0.2的GI集群,11.2.0.4的RAC数据库,需要安装最新的补丁. 补丁下载: 12.1.0.2 GI的PSU:11.2.0.4 DB的PSU:OJVM For 11.2.0 ...