zoukankan      html  css  js  c++  java
  • 表格的交集合集等的命令处理

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

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

  • 相关阅读:
    另一种保证单次插入回文自动机复杂度的做法
    loj #6070. 「2017 山东一轮集训 Day4」基因
    求第一类斯特林数的一行
    NOIP2018游记
    HDU3377 Plan
    【BZOJ】1830: [AHOI2008]Y型项链
    【BZOJ】1832: [AHOI2008]聚会
    【BZOJ】1831: [AHOI2008]逆序对
    【BZOJ】1085: [SCOI2005]骑士精神
    【BZOJ】1798: [Ahoi2009]Seq 维护序列seq
  • 原文地址:https://www.cnblogs.com/feixiangmanon/p/12493727.html
Copyright © 2011-2022 走看看