目录
1. 统计文件的行数
awk '{print NR}' nowcoder.txt|tail -n1
现成的wc命令为何不用?
wc -l
2.打印文件最后五行
cat nowcoder.txt | tail -5
tail命令经常使用,比如查看当前后台wget下载进度的时候:tail -f wget-log
3.输出7的倍数
主要考察for+if的用法
#!/bin/bash
for i in {0..500}
do
if [[ i%7 -eq 0 ]];then
echo $i
fi
done
4.输出第五行的内容
#!/bin/bash
# head提取前5行,tail提取前五行中的最后一行
head -n 5 nowcoder.txt | tail -n 1
# 或者直接用sed
sed -n '5p'
# awk
cat nowcoder.txt | awk "NR==5"
5.打印空行的行号
sed -n '/^$/='
#!/bin/bash
sed -n '/^\s*$/='
正则表达式里面,^表示从头开始匹配,$表示从末尾开始匹配。
顺便复习一下sed的全部语法命令:
- sed 是逐行处理软件,我们可能仅输入了一条 sed 指令,但系统会将该指令应用在所有匹配的数据行上,因此相同的指令会被反复执行 N 次,这取决于匹配到的数据有几行。
- 默认 sed 不支持扩展正则,如果希望使用扩展正则匹配数据,可以使用-r 参数。
- sed 程序使用=指令可以显示行号,结合条件匹配,可以显示特定数据行的行号。
- 在 sed 中支持使用感叹号(!)对匹配的条件进行取反操作。
6. 去掉空行
上一题的延伸,还是使用sed
#!/bin/bash
sed '/^\s*$/d'
7. 打印字母数小于8的单词
用awk,NF表示当前字段的个数
cat nowcoder.txt | awk '{
for (i=1;i<=NF;i++) {
if (length($i)<8)
print $i
}
}'
8. 统计所有进程占用内存大小之和
#!/bin/bash
cat nowcoder.txt | awk '{sum+=$6}END{print sum}'
9.统计每个单词出现的个数
先把空格换成换行符,然后排序并输出频率,然后交换左右两列的顺序输出,最后按照第二列的排序升序输出
cat nowcoder.txt | tr -s ' ' '\n' | sort | uniq -c | awk '{print $2" "$1}' | sort -k2n
10.第二列是否有重复
先用awk找出第二列,然后计数排序,输出出现数量大于1的行,最后再排序一下输出。
cat nowcoder.txt | awk '{print $2}' | sort | uniq -c | awk '{if($1>1){print $1" "$2}}' | sort
11.转置文件内容
这题和LeetCode 194 一模一样~
cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){if(NR==1){res[i]=$i;}else{res[i]=res[i]" "$i}}}END{for(i=1;i<=NF;i++)print res[i]}'
12.打印每一行出现的数字个数
先晾着吧,awk yyds。。。
13.去掉所有包含this的句子
grep -v 'this'
14.求平均值
awk 'NR==1{all=$0} NR>1{total+=$0} END{printf "%.3f" ,total/all}'
15.去掉不需要的单词
grep -vP '(\w){0,}[b,B](\w){1,}'
参考