Добавьте столбец от одного .csv до другого .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

желаемый Output.csv

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

Я попытался использовать "соединение" и "вставку" напрасно. Существует ли команда удара, чтобы сделать это? Столбец "A" является тем же в обоих .csv файлы.

12
задан 24 November 2014 в 19:26

5 ответов

С только awk команда:

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

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


Короткая команда была бы похожа на это:

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

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


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

Ниже команды также копирует последние два столбца (C,D) от file1 в конце каждой строки в file2:

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

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

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

Эта команда также совпадает с выше ($3 и $4 точки к трети и дальше полю каждой строки от file1):

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

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

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

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

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

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

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

11
ответ дан 16 November 2019 в 14:20

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

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. Используйте команду соединения с запятой как Шаг 3 разделителя

join -t,

. Подайте его фактические столбцы, Вы хотите. Отметьте, как Вы подаете его первый столбец дважды, потому что это - то, которое соединение на самом деле выполняется на (поведение по умолчанию 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)

можно перенаправить тот стандартный вывод в файл (desiredOutput), если требуется.

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

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

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

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

9
ответ дан 16 November 2019 в 14:20

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

csvtool pastecol 2 2 file1.csv file2.csv

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

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

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

Замена содержание столбцов, на которые ссылаются в файле 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
7
ответ дан 16 November 2019 в 14:20

Перемещать выбранное число столбцов от одного файла до другого:

#!/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

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

2
ответ дан 16 November 2019 в 14:20

Другой метод в 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
0
ответ дан 16 November 2019 в 14:20

Другие вопросы по тегам:

Похожие вопросы: