如何使用shell脚本加入2个csv文件?

时间:2011-06-10 01:23:22

标签: linux bash scripting

我正在尝试制作一个shell脚本,它将以下列方式组合两个csv文件:

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

startId, endId, roomNum

f2.csv的格式如下:

startId, endId, teacherId 

我想用这种格式将这两者合并为一个csv文件:

startId, endId, roomNum, teacherId. 

使用在Linux下运行的shell脚本实现此目的的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

尝试:

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命令加入我的复合键(在第一列中)并输出我需要的列。

答案 1 :(得分:0)

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

让我解释一下这里发生的事情-F“,”将逗号指定为字段分隔符。

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

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

答案 2 :(得分:0)

使用join -t ';'组合相应的行。 -t选项的参数取决于您的CSV字段分隔符(通常为分号)。请参阅联接手册页上的其余部分。如果您稍后需要减少重复列,请使用cut