Удалить строку, которая имеет более X столбцов в csv

Мне нужно удалить все строки в файле csv, которые имеют более определенного количества столбцов.

Это происходит из-за того, что иногда код, генерирующий CSV-файл, пропускает некоторые значения и печатает следующее в той же строке.

Пример. Рассмотрим следующий файл для анализа. Я хочу удалить все строки, которые имеют более 3 столбцов (т.е. столбцы заголовка):

timestamp,header2,header3
1,1val2,1val3
2,2val2,2val3
3,4,4val2,4val3
5val1,5val2,5val3
6,6val2,6val3

Выходной файл, который я хотел бы иметь:

timestamp,header2,header3
1,1val2,1val3
2,2val2,2val3
5val1,5val2,5val3
6,6val2,6val3

Мне все равно, если строка с меткой времени 4 отсутствует.

Я бы предпочел решение в bash или, возможно, с использованием awk, а не на python, чтобы я мог научиться его использовать.


person Paolo    schedule 02.04.2015    source источник
comment
Вы пытались решить ее самостоятельно?   -  person Kaarel Nummert    schedule 02.04.2015


Ответы (2)


Это можно сделать прямо с помощью awk:

awk -F, 'NF<=3' file

При этом используется переменная awk NF, которая содержит количество полей в текущей строке. Так как мы установили разделитель полей в запятую (с -F, или, эквивалентно, -v FS=","), то это просто вопрос проверки, когда количество полей не превышает 3. Это делается с NF<=3: когда это верно, строка будет напечатана автоматически.

Тест

$ awk -F, 'NF<=3' a
timestamp,header2,header3
1,1val2,1val3
2,2val2,2val3
5val1,5val2,5val3
6,6val2,6val3
person fedorqui 'SO stop harming'    schedule 02.04.2015
comment
Это красивое и умное решение, которое вы могли бы использовать вместо моего. - person sweepy_; 02.04.2015
comment
Большое спасибо. Просто из любопытства, а что, если мне нужны только строки с ровно 3 столбцами? Я пробовал, но не могу просто заменить '‹=' на '==' или '='. Если это трудно сделать, не беспокойтесь. Это было просто из любопытства. - person Paolo; 02.04.2015
comment
@ Паоло, ты все делал правильно! awk -F, 'NF==3' file это путь. - person fedorqui 'SO stop harming'; 02.04.2015

Попробуйте следующее (не забудьте заменить путь к файлу и столбец max):

#! /bin/bash

filepath=test.csv
max_columns=3

for line in $(cat $filepath);
do
    count=$(echo "$line" | grep -o "," | wc -l)
    if [ $(($count + 1)) -le $max_columns ]
            then
            echo $line
    fi
done

Скопируйте это в файл .sh (например, cropper.sh), сделайте его исполняемым chmod +x cropper.sh и запустите ./cropper.sh).

Это выведет только допустимые строки. Затем вы можете поймать результат в файле следующим образом:

./cropper.sh > result.txt

person sweepy_    schedule 02.04.2015
comment
Большое спасибо за ответ и ваше время! - person Paolo; 02.04.2015