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

Я пытался использовать "присоединиться" и "вставить" безрезультатно. Для этого есть команда bash? Колонка "А" одинакова в обоих .csv файлы.

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)
 А, В, С, Д. А., В, С, Д. А., В, С, Д. А., В, С,D  

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


С awk а также paste (вариант А)

Команда ниже также копирует последние два столбца (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 (вариант Б)

Эта команда также такая же, как указано выше ($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)

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

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

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

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

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

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, который также позволяет а) отображать статистику с помощью одной команды (csvstats), б) проверить чистоту данных (csvclean), но также чтобы преобразовать его в json, в sql или даже загрузить в python! Этот инструментарий широко используется в науке данных для подготовки данных.

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

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

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

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

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

Еще один метод в 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
Другие вопросы по тегам