Добавить столбец из одного .csv в другой .csv-файл

10

file1.csv

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

file2.csv

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

желаемый Output.csv

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

Я пробовал использовать «join» и «paste» безрезультатно. Есть ли команда bash для этого? Столбец «A» одинаковый в обоих файлах .csv .

    
задан Roboman1723 24.11.2014 в 14:18
источник

5 ответов

8

Только команда awk :

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

Получите строку из файла1 и сохраните ее в локальной переменной f1 , затем напечатайте строку, которая хранится в f1 , и, наконец, напечатайте третьи ( ) и четвертые ( ) поля из файла1, которые ограничены с запятой , в целом и изменить OFS (разделитель выходного поля [пробел по умолчанию]) на запятую ( , ).

Команда short будет выглядеть так:

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

вставьте файл2, затем вырежьте и вставьте третий столбец в следующий ( -f3- ) из файла1.

С awk и paste (опция A)

Ниже команда также копирует последние два столбца ( C,D ) из файла1 в конце каждой строки файла2:

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

Выше команды вставить содержимое файла2 затем распечатать разделитель запятой ( -d',' ), затем вставьте два последних поля ( NF - это индекс последнего поля, а $NF - это строка, для которой его индекс равен NF . Таким образом, $(NF-1) - это второе поле перед последним полем) из файла1, когда те index переопределяет или разделяет запятую ( -F',' ).

С awk и paste (опция B)

Эта команда также такая же, как и выше ( и указывает на третье и четвертое поле каждой строки из файла1):

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

Или другое решение с командой cut :

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

команда cut в приведенной выше команде сначала вырезает первое поле ( -f1 , которое индексируется разделителем запятой ( -d. )) из файла1 ( cut -d, -f1 file1 ), затем вырезает и вставляет второе поле файла2 ( cut -d, -f2 file2 ) и, наконец, вырезает и вставляет третий столбец ( -f3 ) в соседние ( - ) из файла1 ( cut -d, -f3- file1 ).

Эта команда также возвращает тот же результат:

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

вставьте второе поле из файла1 ( awk -F',' '{print }' file1 ), затем распечатайте запятую ( -d, ), затем вставьте второй столбец из файла2 ( awk -F',' '{print }' file2 ), в конце вставьте второй и последний столбец файла1 ( awk -F',' '{print ","}' file1 ) снова.

    
ответ дан αғsнιη 24.11.2014 в 15:04
источник
8

Вот красота (я думаю):

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

Сломанная последовательность:

Шаг 1. Установите csvkit:

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

Шаг 2. Используйте команду соединения с запятой как разделитель

join -t,

Шаг 3. Загрузите те фактические столбцы, которые вы хотите. Обратите внимание, как вы кормите его первым столбцом дважды, потому что это тот, на котором фактически выполняется соединение (поведение по умолчанию join ).

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

или сокращенно:

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

При желании вы можете перенаправить этот стандартный вывод в файл (желаемый вывод).

Преимущества

Этот метод имеет несколько преимуществ перед другими.

Прежде всего, он выполняет реальное соединение. Это означает, что его можно использовать и для более сложных данных. Например, очень просто сделать соединение в другом поле. Он не просто смотрит на положение поля, но он действительно учитывает колонку. Он фактически работает с форматом данных (csv) и не воспринимает его как текст.

Во-вторых, он использует очень мощный инструментарий csv, который также позволяет вам: a) отображать статистику с помощью одной команды ( csvstats) , b) проверить, чист ли данные ( csvclean ), а также преобразовать ее в json , в sql или даже загружать его в python! Этот инструментарий широко используется в науке о данных для подготовки данных.

    
ответ дан don.joey 24.11.2014 в 16:33
6

Вот еще одна красивая. Я думаю, что это самый простой из всех предложений, до сих пор.

csvtool pastecol 2 2 file1.csv file2.csv

Если вы еще не установили csvtool в прошлом, вам нужно sudo apt-get install csvtool .

Из документов:

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

Замените содержимое столбцов, на которые ссылаются в   file input.csv с одним из соответствующего столбца, указанного в    в update.csv.

     

Пример:

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

Обратите внимание, что в нашем случае мы заменяем второй столбец файлов.

Примеры

file1.csv

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

file2.csv

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

Объединение двух файлов:

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

Что вы в основном делаете, вставьте столбец два из file2.csv в качестве столбца 2 в file1.csv .

Обратите внимание, что это также работает в том же документе. Если вы хотите обменять два столбца, вы можете сделать это, используя тот же файл, что и input.csv и update.vsc.

csvtool pastecol 2 1 file2.csv file2.csv 
A,A
A,A
A,A 
A,A
    
ответ дан don.joey 27.11.2014 в 13:40
2

Чтобы переместить выбранное количество столбцов из одного файла в другой:

#!/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:]))

из двух файлов:

file_1

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

file_2

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

Если вы установите cols = 1 :

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

Но когда вы установите 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

Как использовать

Скопируйте его в пустой файл, установите путь к file1 , file2 и количество столбцов для перемещения, сохраните его как move.py и запустите его:

python3 /path/to/move.py

Также можно добавить один или несколько столбцов из середины колонок исходного файла.

    
ответ дан Jacob Vlijm 24.11.2014 в 17:16
0

Другой метод в python через модуль 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))

Чтобы запустить указанный скрипт,

python3 script.py file1 file2

Вывод:

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
    
ответ дан Avinash Raj 25.11.2014 в 03:58