Selecionando linhas em um arquivo CSV com base no valor da coluna que contém uma vírgula incorporada

0

Eu tenho um arquivo CSV com 4 colunas: Date , User , Email e Comment

Como eu filtraria as linhas que têm too much, later na coluna Comment e, em seguida, as leria em um novo arquivo chamado input1.csv ?

Abaixo está o que eu tentei, mas input1.csv ficou em branco:

awk -F , '$4 == "too much, later" { print }' input.csv > input1.csv

Aqui está a entrada de amostra:

Date,User,Email,Comment
11/22/16,aaaa,[email protected],too much,later 
    
por eulerprime 30.01.2017 / 08:56

4 respostas

2

Isso pode ser feito com awk , mas é estranho. :) É muito melhor fazer isso com um analisador de CSV real, como o csvkit :

csvgrep -c Comment -m 'too much, later' file.csv
    
por 30.01.2017 / 09:14
2

Supondo um CSV formatado corretamente:

Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"

Isso funciona usando csvkit :

$ csvgrep -c Comment -m 'too much, later' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"

$ csvgrep -c 4 -m 'too much, later' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"

Como alternativa, use sed (já que sabemos que está na última coluna):

$ sed -n -e '1p' -e '/too much, later"$/p' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],"too much, later"

Com os dados, conforme mostrado na pergunta:

$ sed -n -e '1p' -e '/too much,later$/p' data.csv
Date,User,Email,Comment
11/22/16,aaaa,[email protected],too much,later 
    
por 30.01.2017 / 11:21
1

Vejo um problema simples: a string too much, later contém um , (vírgula) e seu separador de campo também é , , então o parâmetro $ 4 será too much e $ 5 será later .

Você pode alterar seu código para:

awk -F , '$4 == "too much" && $5 == "later " { print }' input.csv > input1.csv

Observe que essa solução funcionará somente se o último campo for exatamente too much,later (observe o espaço final na string).

Uma solução baseada em regex é mais robusta:

awk -F , '/,\s*too\s+much,\s*later\s*/{ print }' input.csv > input1.csv

Nesta solução, você pode ter qualquer quantidade de caracteres de espaço na string.

    
por 30.01.2017 / 10:01
0
awk -F"," 'NF>4 { 
    b=$0; $1=$2=$3=""
    if (match($0,/too much, ?later/)) 
        print b
}' OFS="," input.csv > input1.csv
    
por 02.02.2017 / 18:47