我有一个包含许多列和行的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.
答案 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