CSV过滤具有混合数据类型的列

时间:2020-05-29 22:28:52

标签: csv unix awk duplicates

我有一个包含许多列和行的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{$_}++ }})' < combined4.csv > combined6.csv
Name "main::seen" used only once: possible typo at -e line 1.

3 个答案:

答案 0 :(得分:1)

如果您的CSV数据不平凡,并且在引号字段中包含逗号之类的东西,那么比起尝试使用{ beamed: [ 'Seth#Beamed', 'John #Beamer', 'Alex#BEAMED' ], } 或类似工具,了解格式的工具是更好的选择。

使用Text::CSV_XS module(通过OS软件包管理器或喜欢的CPAN客户端安装)的perl单线示例:

awk

答案 1 :(得分:1)

不确定在创建数组之前过滤掉每个数组中的内容是什么,我看不出什么错。

但是,如果您想保留所有内容,则添加“或不添加” 子句会做到这一点。

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

答案 2 :(得分:1)

在此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