文件1.csv
A,,C,D
A,,C,D
A,,C,D
A,,C,D
Run Code Online (Sandbox Code Playgroud)
文件2.csv
A,B
A,B
A,B
A,B
Run Code Online (Sandbox Code Playgroud)
所需的输出.csv
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
Run Code Online (Sandbox Code Playgroud)
我试过使用“加入”和“粘贴”无济于事。是否有 bash 命令来执行此操作?两个.csv文件中的“A”列相同。
αғs*_*нιη 11
awk命令:awk -F, '{getline f1 <"file2" ;print f1,$3,$4}' OFS=, file1
Run Code Online (Sandbox Code Playgroud)
从 file1 中获取一行并将其存储到局部变量中f1,然后打印存储在其中的行,f1最后打印file1 中以逗号分隔的第三个($3)和第四个($3)字段,,并更改 OFS(输出字段分隔符 [space by默认]) 到逗号( ,)。
paste -d, file2 <(cut -d, -f3- file1)
Run Code Online (Sandbox Code Playgroud)
A B C D A B C D A B C D A B C D
粘贴文件 2,然后将第三列剪切并粘贴到文件 1 中的 next( -f3-)。
awk和paste(选项A)下面的命令还会复制C,Dfile2 中每行末尾的 file1 中的最后两列 ( ):
paste -d',' file2 <(awk -F',' '{print $(NF-1)","$NF}' file1)
Run Code Online (Sandbox Code Playgroud)
当这些索引重新定义时,上面的命令粘贴file2 内容,然后打印一个逗号分隔符(-d',')然后粘贴最后两个字段(NF是最后一个字段的索引,$NF是其索引所在的字符串NF。$(NF-1)最后一个字段之前的第二个字段也是如此)或用逗号旁观者( -F',')分割。
awk和paste(选项 B)此命令也与上面相同($3并$4指向 file1 中每行的第三个和第四个字段):
paste -d',' file2 <(awk -F',' '{print $3","$4}' file1)
Run Code Online (Sandbox Code Playgroud)
cut命令的另一种解决方案:paste -d, <(cut -d, -f1 file1) <(cut -d, -f2 file2) <(cut -d, -f3- file1)
Run Code Online (Sandbox Code Playgroud)
切口在上述命令的命令第一切割第一场(-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)
Run Code Online (Sandbox Code Playgroud)
粘贴 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)
Run Code Online (Sandbox Code Playgroud)
步骤 1. 安装 csvkit:
sudo pip install csvkit
sudo apt-get install python-dev python-pip python-setuptools build-essential
Run Code Online (Sandbox Code Playgroud)
步骤 2. 使用带有逗号作为分隔符的 join 命令
join -t,
Run Code Online (Sandbox Code Playgroud)
第 3 步。向它提供您想要的实际列。请注意您如何将第一列提供给它两次,因为这是实际执行连接的那一列(默认行为join)。
join -t, <(csvcut --columns 1,3,4 file1.csv) <(csvcut --columns 1,2 file2.csv)
Run Code Online (Sandbox Code Playgroud)
或简写:
join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以将该标准输出重定向到文件 (desiredOutput)。
这种方法与其他提议的方法相比有几个优点。
首先也是最重要的:它执行真正的连接。这意味着它也可以用于更复杂的数据。例如,在另一个字段上进行连接非常容易。它不是简单地查看字段的位置,而是真正将列考虑在内。它实际上适用于数据格式 (csv),并且不会将其视为文本。
其次,它使用非常强大的 csv 工具包,它也允许你 a) 用一个命令显示统计信息 ( csvstats), b) 检查数据是否干净 ( csvclean),还可以将其转换为 json、sql,甚至将其加载到Python!该工具包在数据科学中大量用于数据准备。
这是另一个美丽的。我认为这是迄今为止所有建议中最简单的。
csvtool pastecol 2 2 file1.csv file2.csv
Run Code Online (Sandbox Code Playgroud)
如果您过去尚未安装 csvtool,则必须安装sudo apt-get install csvtool.
从文档:
Run Code Online (Sandbox Code Playgroud)pastecol <column-spec1> <column-spec2> input.csv update.csv将文件 input.csv 中引用的列的内容替换为 update.csv 中指定的相应列之一。
例子:
Run Code Online (Sandbox Code Playgroud)csvtool pastecol 2-3 1- input.csv update.csv.csv > output.csv
请注意在我们的例子中我们如何替换文件的第二列。
文件1.csv
A,,C,D
A,,C,D
A,,C,D
A,,C,D
Run Code Online (Sandbox Code Playgroud)
文件2.csv
A,B
A,B
A,B
A,B
Run Code Online (Sandbox Code Playgroud)
合并两个文件:
csvtool pastecol 2 2 file1.csv file2.csv
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
Run Code Online (Sandbox Code Playgroud)
您本质上所做的是将第二列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
Run Code Online (Sandbox Code Playgroud)