Linux bash中的CSV文件清理

Linux bash中的CSV文件清理,linux,bash,csv,awk,sed,Linux,Bash,Csv,Awk,Sed,我有一个以“,”分隔的CSV文件,我想在postgres db中使用它进行进一步处理,但并非所有行都有正确的列数 我正在研究一种删除所有没有指定分隔符数(15)的行的方法 我见过很多sed/awk解决方案,但没有一个能完全满足我的需要。谢谢 您可以使用Perl one liner来处理文件: $perl-lane'$c=$\u=~ tr/,/;如果$c==14'输入文件.csv>输出文件.csv,则打印$ 这将读取input_file.csv中的所有行,如果一行包含15个逗号,它将把该行打印到

我有一个以“,”分隔的CSV文件,我想在postgres db中使用它进行进一步处理,但并非所有行都有正确的列数

我正在研究一种删除所有没有指定分隔符数(15)的行的方法


我见过很多sed/awk解决方案,但没有一个能完全满足我的需要。谢谢

您可以使用Perl one liner来处理文件:

$perl-lane'$c=$\u=~ tr/,/;如果$c==14'输入文件.csv>输出文件.csv,则打印$


这将读取
input_file.csv
中的所有行,如果一行包含15个逗号,它将把该行打印到
output_file.csv

,我认为这应该可以:

grep -e '^[^,]*\(,[^,]*\)\{15\}$' data.csv
或者使用ruby:

ruby -ne 'print if $_.count(",")==15' < data.csv
ruby-ne'如果$\u.count(“,”==15'
在awk中。将
替换为另一个
,计算子替换的数量,并打印正确数量的子替换:

$ awk 'gsub(/,/,",")==15' file
Ast没有测试数据,也没有输出。你只要相信我

awk -F, 'NF!=16' file
更多字符。

awk-v FS=','NF==16'
awk -v FS=',' 'NF==16' <csv>

try
awk-F,'NF==15'file.csv
@Sundeep:that-off-by-one-errors;)@埃里克·杜米尼是的。。。如果所需的分隔符数为
15
,则应为
NF==16
。。将其与字段数混淆…谢谢!我已经一个接一个地尝试了下面所有的解决方案,都成功了:)。为什么不使用一个更简单的
perl-F,-ane'print if$#F==14'
TIMTOWTDI:)肯定也会起作用,而且会更快。也可以使用
-x
选项指定行匹配,而不是
^$
,这一个实际上会打印出我不想要的所有行,但这也很方便。谢谢是的,当您在需求中使用双重否定时,
**删除**所有**没有**指定数量(15)分隔符的行
,并且不显示示例输入/输出,很容易让我们感到困惑。如果您以积极的方式编写需求(
打印所有具有指定数量(15)个分隔符的行
),那么就不会那么容易混淆,如果您包含了示例输入/输出,就根本不会混淆。