2016-11-24 4 views
2

У меня есть файл CSV с разделителем ',', который я бы хотел использовать для дальнейшей обработки в postgres db, но не все строки имеют правильное количество столбцов.Очистка CSV-файла в bash

Я изучаю способ удаления всех строк, которые не имеют определенного числа (15) разделителей.

Я видел много решений sed/awk, но ни один из них не достигнет того, что мне нужно. Благодаря!

+1

попробовать 'AWK -F 'NF == 15' file.csv' – Sundeep

+1

@Sundeep: те, проклятый вне череде ошибок;) –

+0

@EricDuminil да ... должно быть' NF == 16', если требуется количество разделителей '15' .. путают его с количеством полей ... – Sundeep

ответ

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