今天遇到一个棘手的问题,对端平台推送过来的数据有问题导致数据无法正常集成,由于是周六,期待对方整改基本没戏,咋办嘞,只能自己手工处理了。
问题描述
有个几十万行的数据,存在异常的行(某数值列,列值大于1000,属于异常值),但是行号是随机分布的,没有规律,不能直接使用 sed
删除。
处理方案
使用 awk
命令已经找到了异常的数据行,但是搜索了好久也找不到 awk
和 sed
结合使用的方法,遂放弃。
想要删除这些异常数据,sed
是肯定要用的,现在异常数据行随机分布,能不能让它集中到一块呢?排序行不行?搜索了一下,还真能排序,只不过排序结果只是显示结果,遂将排序结果存入新文件
先按照异常值列排序
sort -t '|' -k 3rn,3 file.txt > file2.txt
如上代码按照第三列倒序排序,正序排序是 -k 3n,3
这样的。
删除异常数据行
sed -i '1,176d' file2.txt
然而,删除后发现表头没了,表头去哪儿了呢,vi 打开文件查看,发现表头被排序到了末尾行,只能再想办法处理了。
想到的方法是拼接,把 file.txt 的表头和 file2.txt 的数据行进行拼接。
数据拼接
- 获取表头,写入新文件:
cat file.txt |head -1 > file3.txt
- 打开已排序文件,删除表头。
vi file2.txt
打开该文件,键盘输入 GG
光标移动到末尾行,输入 dd
删除末尾行 ,输入 :wq!
退出并保存
- 将数据行追加到新文件 file3.txt
cat file2.txt >> file3.txt
至此,file3.txt 就是删除了异常数据行的新文件了,问题搞定。