删除csv[awk,sed]中未删除列中的逗号

删除csv[awk,sed]中未删除列中的逗号,awk,sed,Awk,Sed,有没有一种简单的方法可以删除csv中使用AWK/SED不应该存在的逗号 .csv由5列组成,但额外的逗号使某些行出现6列。例如,请参见下面的第三列,我希望第三列是数字,但您可以看到第3行和第4行是字符串 4,abc,323,123,acvd 4,abc,323,123,acvd 4,ab,c,323,123,acvd 4,db,c,323,123,acvd 我不想过度设计我可能会使用pandas/python的解决方案 它也是一个非常大的5GB文件,超过百万行,所以我无法在excel中打开它

有没有一种简单的方法可以删除csv中使用AWK/SED不应该存在的逗号

.csv由5列组成,但额外的逗号使某些行出现6列。例如,请参见下面的第三列,我希望第三列是数字,但您可以看到第3行和第4行是字符串

4,abc,323,123,acvd
4,abc,323,123,acvd
4,ab,c,323,123,acvd
4,db,c,323,123,acvd
我不想过度设计我可能会使用pandas/python的解决方案

它也是一个非常大的5GB文件,超过百万行,所以我无法在excel中打开它

期望的输出是添加或删除添加字符串,即

4,abc,323,123,acvd
4,abc,323,123,acvd
4,abc,323,123,acvd
4,dbc,323,123,acvd

4,abc,323,123,acvd
4,abc,323,123,acvd
4,ab,323,123,acvd
4,db,323,123,acvd

使用以下Perl一行程序:

perl -F',' -lane 'if ( @F > 5 ) { $_ = join ",", $F[0], "$F[1]$F[2]", @F[3..$#F]; } print;' in_file

输出:

4,abc,323,123,acvd
4,abc,323,123,acvd
4,abc,323,123,acvd
4,dbc,323,123,acvd
Perl one liner使用以下命令行标志: -e:告诉Perl在线查找代码,而不是在文件中。 -n:一次循环输入一行,默认情况下将其分配给$。 -l:在行内执行代码之前,默认情况下在*NIX上去掉\n输入行分隔符,并在打印时附加它。 -a:将$拆分为空格上的数组@F或-F选项中指定的正则表达式上的数组@F。 -F',':按逗号而不是空格拆分为@F

另见: 这个简单的awk脚本也可以完成您的工作:

awk'BEGIN{FS=OFS=,}NF==6{$2=$2$3;$3=;sub/,/,}1'file.csv 美国广播公司,323123,acvd 美国广播公司,323123,acvd 美国广播公司,323123,acvd 4,dbc,323123,acvd
由于删除额外字段是您可以接受的选项:

$ awk 'BEGIN{FS=OFS=","} {print $1, $2, $(NF-2), $(NF-1), $NF}' file
4,abc,323,123,acvd
4,abc,323,123,acvd
4,ab,323,123,acvd
4,db,323,123,acvd
否则:

$ awk 'BEGIN{FS=OFS=","} {print $1, $2 (NF>5 ? $3 : ""), $(NF-2), $(NF-1), $NF}' file
4,abc,323,123,acvd
4,abc,323,123,acvd
4,abc,323,123,acvd
4,dbc,323,123,acvd

在本例中,哪个逗号是“额外的”?第3行和第4行应该解释为什么?欢迎使用堆栈溢出。请在问题中添加您自己的代码。你至少要展示你自己为解决这个问题所做的大量研究。完美作品——也会让读者阅读