如何使用shell脚本合并两个csv文件?

5

我将尝试编写一个shell脚本,以以下方式合并两个csv文件:

我有两个csv文件,f1.csv和f2.csv。f1.csv的格式如下:

startId, endId, roomNum

f2.csv的格式如下:

startId, endId, teacherId 

我想将这两个文件合并成一个CSV文件,并按照以下格式排列:
startId, endId, roomNum, teacherId. 

在 Linux 下运行的 shell 脚本中,最好的方法是什么?


1
你尝试过在谷歌上搜索“bash合并文本文件列”吗? - ypnos
1
问题并不完整。在你指定所有边界之前,没有人(包括已经回答的答案)能够给出正确的答案。例如,如果这里没有成对出现,如果这里有相同的startid,但endid不同等等。没有这些信息,所有的解决方案都只是最佳猜测。(或者,你可以定义:已经确保两个文件具有相同数量的行,并且两个文件具有相同的“startid;endid”,文件仅在第三列(房间、教师)中有所不同。) - clt60
3个回答

4

尝试:

join -t, -1 1 -2 1 -o 1.2 1.3 1.4 2.4 <(awk -F, '{print $1":"$2","$0}' f1.csv | sort) <(awk -F, '{print $1":"$2","$0}' f2.csv | sort)

工作原理:

1)我首先创建一个复合键列,通过将startId和endId连接成startId:endId来处理两个文件。

awk -F, '{print $1":"$2","$0}' f1.csv
awk -F, '{print $1":"$2","$0}' f2.csv

2) 我将两个输出进行排序:

awk -F, '{print $1":"$2","$0}' f1.csv | sort 
awk -F, '{print $1":"$2","$0}' f2.csv | sort 

3) 然后我使用join命令,在我的复合键上进行连接(第一列),并输出我需要的列。


0
使用join -t';'来组合相应的行。-t选项的参数取决于你的CSV字段分隔符(通常是分号)。在join的manpage上查看其余内容。如果您需要稍后缩小重复列,请使用cut

0
awk -F"," '{print $1","$2","$3",9999"}' f1.csv > newFile;
awk -F"," '{print $1","$2",9999,"$3}' f2.csv >> newFile

让我解释一下这里发生了什么- "-F"指定逗号作为字段分隔符。

对于缺少的列,我用文本9999替换,你可以用任何你喜欢的东西替换。第一个命令将标准输出重定向到一个名为“newFile”的文件中,而第二个命令将标准输出附加到相同的文件中。

希望这可以帮助你,你的问题不太清楚,你想从每个文件中缺少的字段做什么。


1
你正在将文件追加而不是在特定列上进行连接。 - dogbane
问题最终需要创建一个新文件。没有指定要加入的字段。我们假设f1.csv和f2.csv的startID是唯一的。这是一个完全正确的答案。不是吗?例如,参见jm666对原始问题的评论。我的答案既不正确也不错误。同样也可以说你的答案。 - matchew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接