2011-06-10 34 views
3

我想制作一个shell脚本,它将以下列方式组合两个csv文件:如何使用shell脚本连接2个csv文件?

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

startId, endId, roomNum 

f2.csv有这样的格式:

startId, endId, teacherId 

我想这两个到一个CSV文件用这种格式结合:

startId, endId, roomNum, teacherId. 

使用在Linux下运行的shell脚本完成此操作的最佳方法是什么?

+1

您是否尝试过Google搜索“bash merge columns textfile”? – ypnos 2011-06-10 01:34:25

+1

问题不完整。没有人(包括已经在这里的答案)可以给出正确的答案,直到您指定所有边距。例如,如果这里没有对,那么如果这里是常见的startid,但是不同的endid等等。没有这些,所有的解决方案将只是最好的猜测。 (或者,您可以定义:已经确保这两个文件的行数相同,并且这两个文件在第3列(房间,教师)中具有相同的“startid; endid”和文件差异。) – jm666 2011-06-10 11:02:28

回答

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

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

对于缺少的列我用文本9999替换,您可以用任何你喜欢的替换。第一个命令是将stdout重定向到一个名为'newFile'的文件,第二个命令是将stdout附加到同一个文件。

我希望这会有所帮助,你的问题是不清楚你想要做什么与每个文件中的缺失字段。

+1

-1您正在附加文件而不是在特定列上加入它们 – dogbane 2011-06-10 08:21:30

+0

问题最终需要一个新文件。没有指定加入的字段。我们假设startID对于f1.csv和f2.csv是唯一的。这是一个非常合适的答案。没有?例如,请参阅jm666对原始问题的评论。我的回答既不正确也不正确。关于你的答案也可以这样说。 – matchew 2011-06-10 14:16:49

0

使用join -t ';'来组合相应的行。 -t选项的参数取决于您的CSV字段分隔符(通常是分号)。请参阅加入的联机帮助页面上的其余部分。如果您稍后需要修剪重复的列,请使用cut

2

尝试:

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)I两个输出进行排序:

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

3)I然后使用join命令加入我的复合键(在第一列)和输出只是我需要的列。