CSV 筛选具有混合数据类型的列



我有一个包含许多列和行的CSV。 第 4 列有一些字符串,有些没有。 当我尝试过滤掉重复项时,它会删除我想保留的重复项。

当我运行时:

awk -F ',' '!seen[$4]++' oldfile.csv > newfile.csv

71523180,PRASAD  JAMES ANAND, ,#3 ALEX BOYD LINK HILLSBORO
71523190,PRASAD  SHAKUNPALA, ,#3 ALEX BOYD LINK HILLSBORO
71523200,PRASAD  BOBBY UMENDRA, ,#3 ALEX BOYD LINK HILLSBORO

它返回我想要的:

71523180,PRASAD  JAMES ANAND, ,#3 ALEX BOYD LINK HILLSBORO

但是,当我运行那行代码时

71508050,"HUNT,  RICHARD F", ,1009 # B FATHOM DR
71508060,"HUNT,  RICHARD F", ,1009 # B FATHOM DR
71561950,"HUNT,  RICHARD F", ,1009 # B FATHOM DR
71562840,"HUNT,  RICHARD F", ,1009 # B FATHOM DR

它会删除所有这些条目。

怎么办?谢谢


跟进

使用 perl 似乎有效,但给了我一个小错误。 这是一个问题吗?

$
perl -w -MText::CSV_XS=csv -e 'csv(in => \*STDIN, filter => { 4 => sub { ! $seen{$_}++ }}('combined6.csv 名称"main::seen"只使用一次:-e 第 1 行可能有拼写错误。

如果您的 CSV 数据不平凡,并且在引号字段中包含逗号之类的内容,那么知道格式的工具比尝试在其上使用awk或类似内容更好。

使用Text::CSV_XS模块的 perl 单行示例(通过您的操作系统包管理器或最喜欢的 CPAN 客户端安装(:

$ perl -MText::CSV_XS=csv -e 'csv(in => *STDIN, filter => { 4 => sub { ! $seen{$_}++ }})' < input.csv
71508050,"HUNT,  RICHARD F"," ","1009 # B FATHOM DR"

不确定我是否看到过滤掉任何错误,因为即使在创建之前,每个数组中

都没有。但是如果你想保留,那么一切都添加一个"或什么都没有" 条款会这样做。

awk -F ',' '!seen[$4]++||$4!=""' 

在此CSV 上使用 Miller (https://github.com/johnkerl/miller(

71523180,PRASAD  JAMES ANAND, ,#3 ALEX BOYD LINK HILLSBORO
71523190,PRASAD  SHAKUNPALA, ,#3 ALEX BOYD LINK HILLSBORO
71523200,PRASAD  BOBBY UMENDRA, ,#3 ALEX BOYD LINK HILLSBORO
71508050,"HUNT,  RICHARD F", ,1009 # B FATHOM DR
71508060,"HUNT,  RICHARD F", ,1009 # B FATHOM DR
71561950,"HUNT,  RICHARD F", ,1009 # B FATHOM DR
71562840,"HUNT,  RICHARD F", ,1009 # B FATHOM DR

和跑步

mlr --csv -N sort -f 4 then step -a counter -f 4 -g 4 then filter '$4_counter==1' then cut -x -f 4_counter input.csv >output.csv

你将拥有

71523180,PRASAD  JAMES ANAND, ,#3 ALEX BOYD LINK HILLSBORO
71508050,"HUNT,  RICHARD F", ,1009 # B FATHOM DR

最新更新