阅读(1421) (0)

AWK 基本示例

2016-08-12 21:30:16 更新

基本示例

本章节中,我们将用几个示例来讲解几个有用的 AWK 命令。 假设我们经有一个文件文件 marks.txt 等待处理,它所包含的内容如下:

1)    Amit     Physics    80
2)    Rahul    Maths      90
3)    Shyam    Biology    87
4)    Kedar    English    85
5)    Hari     History    89

打印列或域

我们可以使用 AWK 命令仅输出输入文件中某些特定的列的内容。示例如下:

[jerry]$ awk '{print $3 "\t" $4}' marks.txt

执行上面的命令可以得到如下结果:

Physics    80
Maths      90
Biology    87
English    85
History    89

在 marks.txt 文件中,第三列包含课程名字,第四列包含在该课程的得分。我们使用 AWK 输出命令只输出了这两列的内容。上面例子中,$3与$4代表输入记录中的第三列与第四列的内容。

输出所有行

默认情况下,如果某行与模式串匹配,AWK 会将整行输出:

[jerry]$ awk '/a/ {print $0}' marks.txt

执行上面的命令可以得到如下结果:

2)    Rahul    Maths      90
3)    Shyam    Biology    87
4)    Kedar    English    85
5)    Hari     History    89

上面的示例中,我们搜索模式串 a,每次成功匹配后都会执行主体块中的命令。如果没有主体块——默认的动作是输出记录(行)。因此上面的效果也可以使用下面简略方式实现,它们会得到相同的结果:

[jerry]$ awk '/a/' marks.txt

通过匹配模式串输出列

前面我们已经看到了,当模式串匹配成功后, AWK 默认会输出整个记录。不过,我们可以让 AWK 只输出特定的域(列)的内容。 例如,下面的这个例子中当模式串匹配成功后只会输出第三列与第四列的内容:

[jerry]$ awk '/a/ {print $3 "\t" $4}' marks.txt

执行上面的命令可以得到如下结果:

Maths      90
Biology    87
English    85
History    89

以任意顺序输出列

我们能以任意顺序输出各列吗?当然可以! 下面的例子中我们将在第四列后输出第三列的内容:

[jerry]$ awk '/a/ {print $4 "\t" $3}' marks.txt

执行上面的命令可以得到如下结果:

90    Maths
87    Biology
85    English
89    History

计数匹配次数并输出

让我们尝试一个更有意思的例子,在这个例子中我们会统计模式串成功匹配的次数,并将该结果打印出来:

[jerry]$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt

执行上面的命令可以得到如下结果:

Count = 4

上面这个例子中,每次成功的匹配我们都会增加计数器的值,并在结束块中将该计数器的值输出。 请注意,与其它编程语言不一样的地方在于, AWK 在使用一个变量前不需要特意地声明这个变量。

输出字符数多于 18 的行

这个例子中我们只输出那些字符数超过 18 的记录:

[jerry]$ awk 'length($0) > 18' marks.txt

执行上面的命令可以得到如下结果:

3)    Shyam    Biology    87
4)    Kedar    English    85

AWK 提供了内置的 length 函数。该函数返回字符串的长度。变量 $0 表示整行,缺失的主体块会执行默认动作,例如,打印输出。 因此,如果一行中字符数超过 18, 则比较的结果为真,该行则被输出。