HOME | Links | About | Read

用shell命令处理数据

前言

有 2 份csv格式的数据,内容大概是这样的

"riid:cb33ecb9-b76b-4633-9d80-26723838a0ba","1","32049683@JS"
"riid:ced95b55-a3cb-4f24-b440-d56b5bf9f476","1","32000928@JS"
"riid:87c1b470-1b4a-4969-95fc-09d39e1b2182","1","32010008@JS"

第一列是主键,第二列是状态值,主要是比对这两列,一份文件中包含另一份中所有的riid,几万行至十几万行的数据,用excel处理,电脑卡的动不了,于是打算扔到 linux 下处理下,大致分为分列、去引号、排序、比对。

分列

我们不需要最后一列数据,可以将其去掉

cat 1.csv |cut -d \, -f 1,2 > 2.csv

-d 指定分隔符,在这里是逗号,-f 选择需要的字段,我们需要第一列和第二列,最后用重定向符号> 将截取的数据输出到文件。2.csv 的内容是这样的。

"riid:cb33ecb9-b76b-4633-9d80-26723838a0ba","1"
"riid:ced95b55-a3cb-4f24-b440-d56b5bf9f476","1"
"riid:87c1b470-1b4a-4969-95fc-09d39e1b2182","1"

去除引号

引号没什么用,还影响比较,可以将其去掉。

sed -i 's/"//g' 2.csv

因为引号只出现在数据列两边,所以处理比较简单.

riid:cb33ecb9-b76b-4633-9d80-26723838a0ba,1
riid:ced95b55-a3cb-4f24-b440-d56b5bf9f476,1
riid:87c1b470-1b4a-4969-95fc-09d39e1b2182,1

排序

排序很简单

sort 2.csv -o 2.csv

对2.csv 进行排序,结果输出到原文件。 也可以只按照某列排序

sort -t, -k 1 2.csv -o 2.csv

以逗号为分隔符,按第一列的字符升序进行排序,结果输出到原文件。

比对

接下来就可以比对了

2 个文件中相同的部分

comm -12 2.csv 3.csv

2 个文件中状态值不一致的部分

diff 1.csv 2.csv -y | grep \|