2016-11-24 82 views
2

我有一个CSV文件用','分隔,我想用它在postgres数据库中进一步处理,但不是所有的行都有正确的列数。在bash中的CSV文件清理

我正在寻找一种方法来删除所有没有指定数量(15)的分隔符的行。

我见过很多sed/awk解决方案,但没有一个能够完成我所需要的。谢谢!

+1

试'的awk -F, 'NF == 15' file.csv' – Sundeep

+1

@Sundeep:那些该死的off-by-一个错误;) –

+0

@EricDuminil是啊...应该是'NF == 16'如果分隔符的数量是'15' ..与字段数量混淆... – Sundeep

回答

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

你可以使用Perl的一行来处理文件:

$ perl -lane '$c = $_ =~ tr/,//; print $_ if $c == 14' input_file.csv > output_file.csv

这将从input_file.csv读取所有行,如果行包含15个逗号,将打印的行output_file.csv

+0

为什么不是简单的'perl -F,-ane'打印如果$#F == 14'' – Sundeep

+0

TIMTOWTDI :)肯定会工作得太快,速度会更快。 –

0

我认为这应该工作:

grep -e '^[^,]*\(,[^,]*\)\{15\}$' data.csv 

或与红宝石:

ruby -ne 'print if $_.count(",")==15' < data.csv 
+1

也可以使用'-x'选项来指定行匹配而不是'^ $' – Sundeep

0

在awk中。与其他,更换,,算上subtitutions的数量和适量打印的:

$ awk 'gsub(/,/,",")==15' file 

助攻也没有试验数据,没有输出。你只需要相信我。

0
awk -F, 'NF!=16' file 

更多字符。

+0

这个实际上会打印出所有我不想要的行,但这也可以得心应手。谢谢! – pavelpok

+0

是的,当你在你的需求中使用双重否定符时**删除**所有** **不具有指定数量(15)的分隔符的行,并且不显示样本输入/输出,这很容易让我们感到困惑。如果你以积极的方式编写你的需求('打印所有具有指定数量(15)分隔符的行)',那么它就不会令人困惑,如果你包含样本输入/输出,那么就不会有一切都有可能混淆。下次可以, –

+1

) – pavelpok