余苏明的幻想乡

Chapter 9. Awk Built-in Variables(内建变量)

55. FS - Input Field Separator(输入字段分隔符)

默认的输入字段分隔符为空格space

  • 可以使用awk选项-F设置
  • 可以使用内建变量FS=""在BEGIN块内设置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    awk 'BEGIN { FS=","; \
    print "-------------\nName\tTitle\n-------------" } \
    { print $2,"\t",$3; } \
    END {print "-------------"}' employee.txt
    -------------
    Name Title
    -------------
    John Doe CEO
    Jason Smith IT Manager
    Raj Reddy Sysadmin
    anand Ram Developer
    Jane Miller Sales Manager
    -------------

多分隔符

当你文本里各个字段使用的分隔符不一样时,Don’t worry,
你可以指定MULTIPLE多分隔符
FS = "[,:%]"表示以,:%分隔

56. OFS - Output Field Separator(输出分隔符)

FS是输入分隔符,对输入文件进行分隔。
OFS是输出分隔符,对输出文件进行格式化输出。
默认也是space空格
输出是使用逗号,则默认使用OFS的默认值。没有使用逗号,则不使用

1
2
$ awk 'BEGIN { print "test1","test2" }'
test1 test2

1
2
$ awk 'BEGIN { print "test1" "test2" }'
test1test2

Note:使用的是变量时,则不管有没有逗号,都默认有OFS

1
2
3
4
5
6
awk -F, '/^102/ {print $3 $2}' employee.txt
IT Manager Jason Smith
---------------------------------------
awk -F, '/^102/ {print $3$2}' employee.txt
IT Manager Jason Smith

57. RS - Record Separator(记录分隔符)

awk默认的一条记录是一行,而记录分隔符可以将多行看成一条记录处理,也可以将一行拆分成多个记录。

将一行差分成多个记录

1
2
3
4
$ vi employee-one-line.txt
101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand
Ram:105,Jane Miller

没有使用记录分隔符,则只会输出下面结果

1
2
3
$ awk -F, '{print $2}' employee-one-line.txt
John Doe:102

:分隔一行记录

1
2
3
4
5
6
7
8
$ awk -F, 'BEGIN { RS=":" } \
{ print $2 }' employee-one-line.txt
John Doe
Jason Smith
Raj Reddy
Anand Ram
Jane Miller

多行当作一条记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ vi employee-change-fs-ofs.txt
101
John Doe
CEO
-
102
Jason Smith
IT Manager
-
103
Raj Reddy
Sysadmin
-
104
Anand Ram
Developer
-
105
Jane Miller
Sales Manager

-\n为记录分隔符

1
2
3
4
5
6
7
8
$ awk 'BEGIN { FS="\n"; RS="-\n"; OFS=":" } \
{print $2, $3}' employee-change-fs-ofs.txt
John Doe:CEO
Jason Smith:IT Manager
Raj Reddy:Sysadmin
Anand Ram:Developer
Jane Miller:Sales Manager

58. ORS - Output Record Separator(输出记录分隔符)

OFS相同,都是对输出进行格式化,
差别是OFS是对字段间的分隔,而ORS是对记录的分隔

1
2
3
4
5
6
7
8
9
10
11
12
13
$ awk 'BEGIN { FS=","; ORS="\n---\n" } \
{print $2, $3}' employee.txt
John Doe CEO
---
Jason Smith IT Manager
---
Raj Reddy Sysadmin
---
Anand Ram Developer
---
Jane Miller Sales Manager
---

OFS为\n,ORS为\n---\n结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ awk 'BEGIN { FS=","; OFS="\n";ORS="\n---\n" } \
{print $1,$2,$3}' employee.txt
101
John Doe
CEO
--
102
Jason Smith
IT Manager
--
103
Raj Reddy
Sysadmin
--
104
Anand Ram
Developer
--
105
Jane Miller
Sales Manager
---

59. NR - Number of Records(记录条号)

一条记录一个数字,表示第几条记录

Note:BEGIN块NR为0,END块NR为最后一条记录号

1
2
3
4
5
6
7
8
9
10
awk 'BEGIN {print NR} \
{print NR,$1} \
END {print NR}' employee.txt
0
1 101,John
2 102,Jason
3 103,Raj
4 104,anand
5 105,Jane
5

59.5 NF - Number of Fields in a record(一条记录里的列数)

60. FILENAME – Current File Name(获取当前文件的文件名)

当我们后面没有添加输入文件时(比如用通道符|处理的输入流),则获取的FILENAME的值为-

Note:当FILENAME在BEGIN块内时,则获取的值为””空。因为BEGIN块在输入流之前

61. FNR - File “Number of Record”

和NR的区别是FNR是表示当前输入文件的记录数,而NR是整个输入的记录数
FNR在有多个输入文件时会每个文件重新计数,而NR不会