一段统计文本单词个数的shell代码,实在是看不懂,谁能帮着解释下~
#
if [ $# -ne 2 -a $# -ne 1 ];then
echo "usage: 'basename $0' [n] Input_File"
echo
exit
fi
if [ $# -eq 1 ]
then
I_TOP=10
I_FILE=$1
fi
if [ $# -eq 2 ]
then
I_TOP=$1
I_FILE=$2
fi
tr -sc "[A-Z][a-z]" "[\012*]" < $I_FILE | \
tr "[A-Z]" "[a-z] " | \
sort | \
uniq -c | \
sort -k1 -n -r | \
head -$I_TOP | nl
具体思路是这样,
将所有大小写英文字母之外的字符转化为一个回车并将多个回车压缩为一个2. 将所有大写字母转换为小写3. 排序,结果是按字典顺序排好的单词列表,相同的单词挨在一起4. 在每个单词之前显示此单词出现的次数5. 按照出现的次数降序排序6. 取前 n 行输出7. 输出时加上序号
但是代码实在看不懂啦~ 展开
#!/bin/bash
if [ $# -ne 2 -a $# -ne 1 ];then #程序运行时若输入参数少于两个,则提示错误
echo "usage: 'basename $0' [n] Input_File" #-ne表示不等于,-a表示与运算
echo #用法:默认输入一个参数代表文件名,输入两
exit #个参数第一个代表显示行数。
fi
if [ $# -eq 1 ] #如果输入一个参数,则默认显示行数为10行。
then
I_TOP=10
I_FILE=$1
fi
if [ $# -eq 2 ] #如果输入两个参数,则第一个为显示行数,第二个为要处理的文件。
then
I_TOP=$1
I_FILE=$2
fi
tr -sc "[A-Z][a-z]" "[\012*]" < $I_FILE | \ #tr命令你可以自己查找一下帮助,大意是除了大小写字母之外的字符都转化为回车,<是输出重定向,|是管道符,\是续行符
tr "[A-Z]" "[a-z] " | \ #大写转化成小写
sort | \ #重新排序
uniq -c | \ #uniq 的用法
sort -k1 -n -r | \ #sort 的用法
head -$I_TOP | nl #输出