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”列均相同。
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”列均相同。
Answers:
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()。
awk
和paste
(选项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','
)分割。
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.
从文件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
)的第二列和最后一列。
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或什至将其加载到蟒蛇!该工具包在数据科学中大量用于数据准备。
这是另一个美丽的人。到目前为止,我认为这是所有建议中最简单的。
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
要将选定数量的列从一个文件移动到另一个文件:
#!/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
将其复制到一个空文件中,将路径设置为file1
,file2
将要移动的列数,另存为move.py
并通过以下方式运行:
python3 /path/to/move.py
也可以通过这种方式从源文件的列中间添加一列或多列。
import csv
它。
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