awk命令编程
特殊变量
- NR: 表示记录数量,在执行过程中对应当前行号
- NF:表示字段数量,在执行过程中对应当前行的字段数
- $0:这个变量包含执行过程中当前行的文本内容
- $1:这个变量包含第一个字段的文本内容
- $2:这个变量包含第二个字段的文本内容
awk内建的字符串控制函数
- length(string): 返回字符串的长度
- index(string, search_string):返回search_string在字符串出现的位置
- split(string, array, delimiter):用定界符生成一个字符串列表,并将该列表存入数组
- substr(string, start-position, end-position): 在字符串中用字符起止偏移量生成子串,并返回该子串
- sub(regex, replacement_str, string): 将正则表达式匹配到第一处内容替换成replacment_str.
- gsub(regex,replacement_str, string): 和sub()类似。不过该函数会替换正则表达式匹配到的所有内容
- match(regex, string): 检查正则表达式是否能够匹配字符串。如果能够匹配,返回非0值;否则,返回0.math()有两个相关的特殊变量,分别是RSTART和RLENGTH.变量RSTART包含正则表达式所匹配内容的起始位置,而变量RLENGTH包含正则表达式所匹配内容的长度
统计特定文件中的词频
#!/bin/bash
#用途:计算文件中单词的词频
if [ $# -ne 1 ];
then
echo "Usage: $0 filename";
exit -1
fi
filename=$1
egrep -o "\b[[:alpha:]]+\b" $filename | \
awk '{ count[$0]++ }
END{ printf("%-14s%s\n","Word","Count") ;
for(ind in count)
{ printf("%-14s%d\n",ind,count[ind]); }
}'
egrep -o “\b[[:alpha:]]+\b” $filename只用于输出单词。用 -o选项打印出由换行符分隔的匹配字符序列。这样我们就可以在每行中列出一个单词。
\b 是单词边界标记符。[:alpha:] 是表示字母的字符类。awk命令用来避免对每一个单词进行迭代。因为awk默认会逐行执行{}块中的语句,所以我们就不需要再为同样的事编写循环了。借助关联数组,当执行count[$0]++时,单词计数就增加。最后,在END{}语句块中通过迭代所有的单词,就可以打印出单词及它们各自出现的次数。