Adicione a coluna de um .csv a outro arquivo .csv

10

arquivo1.csv

A,,C,D
A,,C,D
A,,C,D
A,,C,D

arquivo2.csv

A,B
A,B
A,B
A,B

Output.csv desejado

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

Eu tentei usar "join" e "paste" sem sucesso. Existe um comando bash para fazer isso? A coluna "A" é a mesma nos dois arquivos .csv .

    
por Roboman1723 24.11.2014 / 15:18

5 respostas

8

Com apenas o comando awk :

awk -F, '{getline f1 <"file2" ;print f1,,}' OFS=, file1

Pegue uma linha do arquivo1 e armazene-a na variável local f1 , imprima a linha que armazenou em f1 e finalmente imprima os terceiros ( ) e adiante ( ) campos do arquivo1 que delimitaram com vírgula , por completo, e mude o OFS (separador de campos de saída [espaço por padrão]) para vírgula ( , ).

O comando curto seria assim:

paste -d, file2 <(cut -d, -f3- file1)
 A,B,C,D  
 A,B,C,D  
 A,B,C,D  
 A,B,C,D  

cole o arquivo2, depois recorte e cole a terceira coluna para a próxima ( -f3- ) do arquivo1.

Com awk e paste (opção A)

Abaixo, o comando também copia as duas últimas colunas ( C,D ) do arquivo1 no final de cada linha no arquivo2:

paste -d',' file2  <(awk -F',' '{print $(NF-1)","$NF}' file1)

Acima do comando cole o conteúdo do arquivo2 e imprima um delimitador por vírgula ( -d',' ), em seguida, cole os dois últimos campos ( NF é o índice do último campo e $NF é a sequência cujo índice é NF . Então $(NF-1) é o segundo campo antes do último campo) do arquivo1 quando esses índice redefine ou divide com vírgula espectador ( -F',' ).

Com awk e paste (opção B)

Este comando também é o mesmo que acima ( e apontam para o terceiro e quarto campo de cada linha do arquivo1):

paste -d',' file2  <(awk -F',' '{print ","}' file1)

Ou outra solução com o comando cut :

paste -d, <(cut -d, -f1 file1) <(cut -d, -f2 file2) <(cut -d, -f3- file1)

corte comando no comando acima primeiro corte o primeiro campo ( -f1 que foi indexado com delimitador por vírgula ( -d. )) do arquivo1 ( cut -d, -f1 file1 ), depois recorte e cole o segundo campo do arquivo2 ( cut -d, -f2 file2 ) e finalmente recorte e cole a terceira coluna ( -f3 ) nos nexts ( - ) do arquivo1 ( cut -d, -f3- file1 ) novamente.

Este comando também retorna o mesmo resultado:

paste -d, <(awk -F',' '{print }' file1) <(awk -F',' '{print }' file2) <(awk -F',' '{print ","}' file1)

cole o segundo campo do arquivo1 ( awk -F',' '{print }' file1 ), imprima uma vírgula ( -d, ), cole a segunda coluna do arquivo2 ( awk -F',' '{print }' file2 ), cole finalmente a segunda e a última coluna do arquivo1 ( awk -F',' '{print ","}' file1 ) novamente.

    
por αғsнιη 24.11.2014 / 16:04
8

Aqui está uma beleza (eu acho):

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

dividido em etapas:

Etapa 1. Instalar o csvkit:

sudo pip install csvkit
sudo apt-get install python-dev python-pip python-setuptools build-essential

Etapa 2. Use o comando join com uma vírgula como separador

join -t,

Etapa 3. Alimente as colunas reais que você deseja. Observe como você alimenta a primeira coluna duas vezes, porque essa é a que a junção é realmente executada (comportamento padrão de join ).

join -t, <(csvcut --columns 1,3,4 file1.csv) <(csvcut --columns 1,2 file2.csv)

ou na forma abreviada:

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

Você pode redirecionar a saída padrão para um arquivo (desejadoOutput), se desejado.

Vantagens

Este método tem várias vantagens sobre os outros propostos.

Primeiro e mais importante: ele realiza uma junção real. Isso significa que também pode ser usado para dados mais complexos. É muito fácil fazer uma junção em outro campo, por exemplo. Ele não olha simplesmente para a posição do campo, mas leva a coluna em consideração. Ele realmente funciona com o formato dos dados (csv) e não o trata como texto.

Em segundo lugar, ele usa o poderoso kit de ferramentas csv que também permite a) exibir estatísticas com um comando ( csvstats) , b) verificar se os dados estão limpos ( csvclean ), mas também transformá-los em json , em sql, ou até mesmo carregá-lo em python! Este kit de ferramentas é muito usado em ciência de dados para preparação de dados.

    
por don.joey 24.11.2014 / 17:33
6

Aqui está outro lindo. Eu acho que é a mais fácil de todas as sugestões, até agora.

csvtool pastecol 2 2 file1.csv file2.csv

Se você ainda não instalou o csvtool no passado, será necessário sudo apt-get install csvtool .

Nos documentos:

pastecol <column-spec1> <column-spec2> input.csv update.csv
     

Substitua o conteúdo das colunas referenciadas no   arquivo input.csv com o da coluna correspondente especificada por    em update.csv.

     

Exemplo:

  csvtool pastecol 2-3 1- input.csv update.csv.csv > output.csv

Note como, no nosso caso, estamos substituindo as segundas colunas dos arquivos.

Exemplos

arquivo1.csv

A,,C,D
A,,C,D
A,,C,D
A,,C,D

arquivo2.csv

A,B
A,B
A,B
A,B

Combinando os dois arquivos:

csvtool pastecol 2 2 file1.csv file2.csv
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

O que você faz essencialmente é colar a coluna dois de file2.csv como coluna 2 em file1.csv .

Observe que isso também funciona no mesmo documento. Se você quiser trocar duas colunas, você pode fazer isso usando o mesmo arquivo como input.csv e update.vsc.

csvtool pastecol 2 1 file2.csv file2.csv 
A,A
A,A
A,A 
A,A
    
por don.joey 27.11.2014 / 14:40
2

Para mover um número escolhido de colunas de um arquivo para outro:

#!/usr/bin/env python3

cols = 1; file_1 = "/path/to/file_1"; file_2 = "/path/to/file_2"

def readfile(file):
      with open(file) as src:
          return [item.strip().split(",") for item in src.readlines()]

file_1 = readfile(file_1); file_2 = readfile(file_2)

for i in range(len(file_1)):
    print((",").join(file_1[i]+file_2[i][-cols:]))

de dois arquivos:

file_1

A,B
A,B
A,B
A,B

arquivo_2

K,L,M
K,L,M
K,L,M
K,L,M

Quando você define cols = 1 :

A,B,M
A,B,M
A,B,M
A,B,M

Mas quando você define cols = 2 :

A,B,L,M
A,B,L,M
A,B,L,M
A,B,L,M

cols = 3 :

A,B,K,L,M
A,B,K,L,M
A,B,K,L,M
A,B,K,L,M

Como usar

Copie-o em um arquivo vazio, defina o caminho para file1 , file2 e o número de colunas a serem movidas, salve-o como move.py e execute-o por:

python3 /path/to/move.py

Também é possível adicionar uma ou mais colunas do meio das colunas do arquivo de origem dessa maneira.

    
por Jacob Vlijm 24.11.2014 / 18:16
0

Outro método em python através do módulo csv.

script.py

#!/usr/bin/python3
import csv
import sys
file1 = sys.argv[1]
file2 = sys.argv[2]
with open(file2, 'r') as r:
    with open(file1, 'r') as f:
        csv_f = csv.reader(f)
        csv_r = csv.reader(r)
        bar = [linex for linex in csv_r]
        foo = [liney[2:] for liney in csv_f]
        zipped = zip(bar,foo)
        result = [x+y for (x,y) in list(zipped)]
        for i in result:
            print(','.join(i))

Para executar o script acima,

python3 script.py file1 file2

Saída:

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
    
por Avinash Raj 25.11.2014 / 04:58

Tags