1. 目的
数据统计中常用的shell命令
目标用户: shell小白
1.1 样例文本
- file1
级别,地区,企业级别,企业数量
1,北京,A,1
1,上海,B,2
0,广东,C,3
0,河北,D,4
2,南京,E,5
0,河北,F,6
1,北京,G,7
1,上海,H,8
2,南京,I,9
0,云南,J,10
2,石家庄,A,10
3,秦皇岛,B,20
2,石家庄,C,30
3,邢台,D,40
0,广东,E,50
1,北京,F,60
2,石家庄,G,70
3,邯郸,H,80
3,新乡,I,90
0,广东,J,100
0,广东,J,1000
1.2 命令
参考: grep详解
参考: cut命令详解
参考: sed命令详解
参考: awk语言详解
2.场景
2.1 查找
- 找到包含"XX"的行
# 场景一: 找到"北京"的行
# 方法1:
cat file1 | grep 北京
# 方法2:
grep 北京 file1
# 场景二: 找到包含"北京"或者"南京"的行
# 方法1:
cat file1 | grep -E "北京|南京"
# 方法2:
grep -E "北京|南京" file1
# 场景三: 找到不包含北京的行
grep -v 北京 file1
# 场景四: 找到不包含北京和南京的行
grep -vE "(北京|南京)" file1
# 注意
grep -vE "[北京|南京]" file1 # 是指包含“北”,“京”,“|”,“南”,“京”这四个字符的行
- 按行查找
# 场景1: 查找并打印出3-6行
sed -n '3,6p' file1 # -n表示打印查找匹配的结果, 如果不加会打印整个file1
- 按列查找
# 场景1: 查找按","分割的第2列
方法一:
cut -d',' -f2 file1
方法二: awk难度稍高, 可跳过
awk -F',' '{print $1}' file1 # $1表示按逗号分割的第1列, $0比较特殊表示整行
# 场景2: 查找按","分割的第2-3列
cut -d',' -f2-3 file1
# 场景3: 某列值满足某种条件的行: 如大于N的行
awk -F',' '$1>1{print $0}' file1 # 输出第1列满足大于1的行
2.2 替换
- sed命令
# 场景1: 替换文件全部的A词变为B词
sed 's/hello/hi/g' file1
# 场景2: 替换以A开头,替换为B
sed 's/^3/B/g' file1
sed 's/$3/B/g' file1 # 每行以3结尾替换为B
2.3 删除
# 场景1: 删除文件第N行
# 方法1: 结果保存到file2(注意: file1没有变化)
sed '1d' file1 > file2 # 删除第1行
sed '$d' file1 > file2 # 删除最后1行
# 方法2: 直接将file1中第1行删除(注意: file1已变化)
sed -i '1d' file1
# 场景2: 删除第n到m行
sed '2,4d' file1 > file2 # 删除2至4行,保持到file2, 其中file1不变
sed -i '2,4d' file1 # 直接删除file1中2至4行,file1已改变
# 场景3: 删除包含"XX"的行, 结果保存到file2
# 方法1: 结果保存到file2(注意: file1没有变化)
sed /北京/d file1 > file2
# 方法2: 直接将file1中包含"XX"的行删除(注意: file1已变化)
sed -i /北京/d file1
2.3 排序
# 场景一: 单列排序, file1第4列倒序排列
cat file1 | sort -k4nr -t ','
# 场景二: 多列排序, file1第1列倒序排列, 第2列倒序排
cat file1 | sort -k1nr -k4nr -t ','
# 分隔符: tab, 须加$符号
cat file1 | sort -k1nr -k4nr -t $'\t'