将一个.csv中的列添加到另一个.csv文件中


12

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”和“粘贴”无济于事。有bash命令可以执行此操作吗?两个.csv文件中的“ A”列均相同。


所以您要复制B列到文件1?还是将C和D列添加到file2?
蒂姆(Tim)

无论哪种方式将是罚款,只要输出相匹配“desiredOutput.csv”
Roboman1723

我添加了一个新答案,我认为它比所有其他答案(包括我的第一个答案)更容易。您可能要考虑接受,以便将来查找该信息。
don.joey 2014年

Answers:


11

仅使用awk命令:

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

从file1中获取一行,并将其存储到局部变量中f1,然后打印存储在其中的行,f1最后从file1中打印以逗号分隔的第三($3)和第四($3)字段,,并更改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中的next()。


使用awkpaste(选项A)

下面的命令还会C,D在file2的每一行末尾复制file1 的最后两列():

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

上面的命令粘贴 file2的内容,然后打印一个逗号delimiter(-d','),然后从file1重新粘贴两个最后一个字段(NF是最后一个字段的索引,$NF是它的索引是的字符串NF$(NF-1)最后一个字段之前的第二个字段也是如此),当这些索引重新定义时或使用逗号分隔符(-F',')分割。

使用awkpaste(选项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.从文件1()) cut -d, -f1 file1),那么剪切和粘贴文件2(第二场cut -d, -f2 file2),最后剪切和粘贴第三列(-f3)到的nextS( -cut -d, -f3- file1再次从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)的第二列和最后一列。


@kasi您可以通过awk本身执行此操作。参见stackoverflow.com/a/14984673/3297613
Avinash Raj 2014年

9

这是一个美丽(我认为):

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命令

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)

您可以根据需要将标准输出重定向到文件(desiredOutput)。

优点

该方法相对于其他建议方法具有几个优点。

首先也是最重要的:它执行真正的联接。这意味着它也可以用于更复杂的数据。例如,在另一个字段上进行联接非常容易。它不仅查看字段的位置,而且确实考虑了该列。它实际上使用数据格式(csv),并且不会像对待文本一样对待它。

其次,它使用功能非常强大的csv工具包,该工具包还允许您a)使用一个命令显示统计信息(csvstats),b)检查数据是否干净(csvclean),还可以将其转换为json,sql或什至将其加载到蟒蛇!该工具包在数据科学中大量用于数据准备。


如果您在Ubuntu上安装,您可能需要先安装Python的开发头文件在安装csvkit:sudo apt-get install python-dev python-pip python-setuptools build-essential- 链接
卡瑞尔

答案也很棒,我正在公司的服务器上工作,所以安装东西大约需要一周的书面工作。虽然可以在我的机器上运行!
Roboman1723 2014年

+1为我展示了另一种CSV数据工具。一个单独的问题,但是您知道一个用于CSV数据文件的独立报告编写器吗?
2014年

@Joe您可以更具体地说明“报告撰稿人”时的意思吗?我不确定我理解你的意思。
don.joey 2014年


7

这是另一个美丽的人。到目前为止,我认为这是所有建议中最简单的。

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

您基本上要做的是将中的第2 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

无疑是最优雅的。
Jacob Vlijm 2014年

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:]))

来自两个文件:

文件_1

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

文件_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

如何使用

将其复制到一个空文件中,将路径设置为file1file2将要移动的列数,另存为move.py并通过以下方式运行:

python3 /path/to/move.py

也可以通过这种方式从源文件的列中间添加一列或多列。


本来希望看到您使用import csv它。
don.joey 2014年

@ don.joey感谢您的建议,一定会调查一下。
Jacob Vlijm 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.