我正在尝试制作一个shell脚本,它将以下列方式组合两个csv文件:
我有两个csv文件,f1.csv和f2.csv。 f1.csv的格式为:
startId, endId, roomNum
f2.csv的格式如下:
startId, endId, teacherId
我想用这种格式将这两者合并为一个csv文件:
startId, endId, roomNum, teacherId.
使用在Linux下运行的shell脚本实现此目的的最佳方法是什么?
答案 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
。