考虑我们有一个文本文件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文件中第3列包含科目名和第四列包含特定科目标记。这里使用AWK的printf命令打印这两列。在上面的例子中$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
可以以任何顺序打印列?是的!当然,我们可以做到这一点。比如下面的例子打印第4列后是第3列。
[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
在上面的例子中,我们增加计数器的值在模式匹配成功时,打印END块这个值。请注意,不像其他的编程语言,这里不需要声明变量就可以直接使用它。
仅打印那些含有多于18个字符的行。
[jerry]$ awk 'length($0) > 18' marks.txt
在执行上面的代码后,得到以下结果:
3) Shyam Biology 87 4) Kedar English 85
AWK提供了内置的长度函数返回字符串的长度。$0 变量存储整行,并在没有主体块默认采取动作即打印操作。因此,如果一行超过18个字符,比较结果为true那么这一行将被打印出来。