工作中经常遇到运营同学需要统计数据,需要从各种表里查询出来各种数据做组织和合并处理,了解了这些命令处理表格就非常简单高效。而且处理的速度比写各种复杂的SQL要高效的多。当然了,只能处理CSV数据。
几个基础命令
sort 排序命令 uniq 唯一命令
sort 参数 | 说明 |
---|---|
-n | 依照数值的大小排序 |
-u | unique,输出的结果是去重 |
-r | 默认是升序,以降序来排序 |
-t | 指定排序时的分隔字符 |
-k | 使用某一列进行排序,1表示第一列 |
-o | 将排序后的结果存入指定的文件 |
uniq 参数 | 说明 |
---|---|
-d | 重复的行 |
-u | 只出现一次行 |
-c | 按照出现的次数 |
cat 1.csv
1,a
8,h
9,i
10,j
20,j
按照第二列降序排列,并且第二列保持唯一
sort -ru -t, -k2 1.csv
20,j
9,i
8,h
1,a
按照第二列输出出现的字数
sort -r -t, -k2 1.csv | awk -F',' '{print $2}' | uniq -c
2 j
1 i
1 h
1 a
重复出现的数据
sort -r -t, -k2 1.csv | awk -F',' '{print $2}' | uniq -dc
j
AWK学习前面的内容
join命令多个文件关联操作
join 参数 | 说明 |
---|---|
-1n | 连接文件1指定的列号 |
-2n | 连接文件2指定的列号 |
-an | 显示文件n的行之外,也显示没有相同列的行 |
-vn | 与-a相同,只显示没有相同列的行 |
-t | 指定排序时的分隔字符 |
-o | 将排序后的结果存入指定的文件 |
cat 1.csv
1,a
8,h
9,i
10,j
cat 2.csv
d,4
e,5
f,6
g,7
h,8
i,9
1.csv的第一列 2.csv的第二列的交集
join -t, -11 -22 1.csv 2.csv
8,h,h
9,i,i
1.csv的第一列 2.csv的第二列的差集
join -t, -11 -22 -v1 1.csv 2.csv
1,a
10,j
1.csv的第一列 2.csv的第二列 2.csv的差集
join -t, -11 -22 -v2 1.csv 2.csv
d,4
e,5
f,6
g,7
按照列输出,输出1.csv的第二列 2.csv的第一列和第二列
join -t, -11 -22 -a1 -o 1.1 2.1 2.2 11.csv 2.csv
11,,
1,,
8,h,8
9,i,9
注意
注意的问题是,使用join命令的时候需要先排序即
sort xx.csv > xxy.csv,多列的话需要使用 sort -u -t分隔符 -k关联的内一列 > xxx.csv 否则某些情况下会出现未排序的提示
join: 1.csv:4: is not sorted: 11,j
处理过问题
以前一个朋友找过来处理过一个简单数据,告诉我有两个文件,一个my.csv一个all.csv,all.csv是这个月的项目列表,my.csv我做过的项目,现在帮我找出我做过的项目有哪些在这个项目里面?CSV里面的后两列是code列和version列唯一确定一个项目。
cat my.csv
项目一,正在做,tony,HM,10
项目二,已完成,Monica,HM,11
项目三,准备,jack,BM,20
项目四,准备,Susan,DM,30
cat all.csv
1,tony,HM,10
2,Monica,HM,11
3,jack,BM,20
4,Susan,DM,30
5,Monica,XM,1
6,Monica,AM,2
7,Monica,BM,3
8,Monica,DM,30
根据后两列生成唯一列 my_u.csv all_u.csv
cat my.csv | awk -F"," '{print $0","$4"_"$5}' > my_u.csv
cat all.csv | awk -F"," '{print $0","$3"_"$4}' > all_u.csv
根据为唯一列排序取唯一数据my_r.csv all_r.csv
sort -u -t, -k6 my_u.csv -o my_r.csv
sort -u -t, -k5 all_u.csv -o all_r.csv
获取all_r.csv my_r.csv关于最后一列的交集就是需要的结果
join -t, -16 -25 my_r.csv all_r.csv
BM_20,项目三,准备,jack,BM,20,3,jack,BM,20
DM_30,项目四,准备,Susan,DM,30,4,Susan,DM,30
HM_10,项目一,正在做,tony,HM,10,1,tony,HM,10
HM_11,项目二,已完成,Monica,HM,11,2,Monica,HM,11
可以看到有四个项目在这个月的项目列表里面,表示已经做完了。