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
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
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
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
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.
awk -F"," 'NF>4 {
b=$0; $1=$2=$3=""
if (match($0,/too much, ?later/))
print b
}' OFS="," input.csv > input1.csv
Tags command-line awk csv