表格的交集合集等的命令处理

工作中经常遇到运营同学需要统计数据,需要从各种表里查询出来各种数据做组织和合并处理,了解了这些命令处理表格就非常简单高效。而且处理的速度比写各种复杂的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

可以看到有四个项目在这个月的项目列表里面,表示已经做完了。

上一篇:Linux Shell练习 - hackerrank


下一篇:android studio/Intellij IDEA(MAC OSX)中android模拟器无法启动的一种原因