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
файлы.
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
) снова.
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! Этот инструментарий в большой степени используется в науке о данных для подготовки данных.
Вот является другой красивым. Я думаю, что это является самым легким из всех предложений к настоящему времени.
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
Также возможно добавить один или несколько столбцов с середины colums исходного файла этот путь.
Другой метод в 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