Mév*_*pek 6 linux csv miller csvkit
我搜索了这个任务,发现了以下较旧的问题:
但我无法使用,awk因为我的数据是一个复杂的 CSV 文件,带有多个嵌套双引号。
假设我想对以下内容进行重复数据删除(简化情况):
Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref1,"foo, bar, base",bar
ref2,aaa,bbb
Run Code Online (Sandbox Code Playgroud)
在输出中我需要它如下:
Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref2,aaa,bbb
Run Code Online (Sandbox Code Playgroud)
没有awk解决方案,只能使用任何 CSV 解析器。
我尝试了以下方法:
mlr --csv uniq -a -g Ref file.csv
Run Code Online (Sandbox Code Playgroud)
但这是一个错误。
Miller 的uniq子命令返回唯一记录以及确定唯一性的字段。任何其他字段都将被丢弃。您收到错误是因为子命令的-a(使用所有字段)和-g(使用特定字段)选项不兼容。
已经给出了仅使用米勒的良好解决方案。在现场分组时使用head子命令 with可能是最方便的解决方案。-n 1Ref
awk您也可以让 Miller 使用( )中常用的相同类型的运算!seen[$1]++,但由于 Miller 没有后置自增运算符,因此它会稍微长一些:
mlr --csv filter '@seen[$Ref] += 1; @seen[$Ref] == 1' file.csv
Run Code Online (Sandbox Code Playgroud)
您还可以使用 Miller 将数据转换为 JSON,然后使用jq执行unique_by()操作,然后让 Miller 将数据转换回 CSV:
mlr --c2j cat file.csv | jq 'unique_by(.Ref)' | mlr --j2c cat
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |