2016-11-24 89 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