Extrai dados de um arquivo e coloca em arquivos diferentes com base no valor da coluna 1

5

Iremos gerar um arquivo csv com valores abaixo

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9

Eu preciso extrair dados e criar arquivos com base na segunda coluna. Se é 577, então toda a linha deve ser extraída e colocada em um arquivo separado. Quer dizer, eu preciso de um arquivo com linhas com a segunda coluna como 577 sozinho e outro arquivo com a segunda coluna como 132 sozinho

Eu tentei usar o IF, mas não funcionou

    
por user3116123 07.02.2014 / 17:37

5 respostas

11

Use awk :

awk -F, '{print >$2".csv"}' file.csv

Isso criará os dois arquivos 577.csv e 132.csv em seu diretório atual.

O comando acima assume que você pode ter apenas 132 ou 577 como o segundo campo. Ele criará um nome de arquivo para cada um dos valores encontrados no segundo campo de todo o file.csv . Se houver outras opções além do reboque em que você está interessado e quiser ignorar essas linhas, faça isso:

awk -F, '$2=="577" || $2=="132"{print >$2".csv"}' file.csv
    
por 07.02.2014 / 17:49
3

Eu gosto da solução awk de terdon, mas por questão de perfeição, aqui está uma sugestão usando apenas bash

while IFS=, read -r a1 a2 a3 a4; do 
    echo "$a1,$a2,$a3,$a4" >> "$a2".csv
done < file.csv

Ele produzirá os arquivos 577.csv e 132.csv no diretório atual.

    
por 07.02.2014 / 18:25
2

Para extrair todos os 577 para stdout

grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv

- editar 1 Corrigido, com base no comentário de @ terdon abaixo para evitar correspondências falsas quando pelo menos 3 vírgulas alinhadas com 577.

grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv

Mas acho que a solução awk dele é mais abrangente.

    
por 07.02.2014 / 17:43
0

Usando csvkit :

$ csvgrep -c 2 -m 577 data.csv >output.csv

O -c 2 faz com que cvsgrep considere a segunda coluna e, com -m 577 , solicitamos que corresponda à string 577 nessa coluna.

O seguinte será gravado em output.csv :

yp1234,577,1,3
yp5678,577,3,5

Para corresponder um número de strings e gravar a saída em um arquivo para cada string:

for pattern in 577 132; do
  csvgrep -c 2 -m "$pattern" data.csv >"output-$pattern.csv"
done

Isso criará os dois arquivos output-132.csv e output-577.csv .

    
por 30.01.2017 / 20:02
-1

grep -i "577" inputfile.csv > outputfilewith577.csv
grep -i "138" inputfile.csv > outputfilewith138.csv

Espero que ajude!

    
por 10.02.2017 / 11:32

Tags