我将尝试编写一个shell脚本,以以下方式合并两个csv文件:
我有两个csv文件,f1.csv和f2.csv。f1.csv的格式如下:
startId, endId, roomNum
f2.csv的格式如下:
startId, endId, teacherId
我想将这两个文件合并成一个CSV文件,并按照以下格式排列:
startId, endId, roomNum, teacherId.
在 Linux 下运行的 shell 脚本中,最好的方法是什么?
我将尝试编写一个shell脚本,以以下方式合并两个csv文件:
我有两个csv文件,f1.csv和f2.csv。f1.csv的格式如下:
startId, endId, roomNum
f2.csv的格式如下:
startId, endId, teacherId
startId, endId, roomNum, teacherId.
在 Linux 下运行的 shell 脚本中,最好的方法是什么?
尝试:
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
命令,在我的复合键上进行连接(第一列),并输出我需要的列。
join -t';'
来组合相应的行。-t选项的参数取决于你的CSV字段分隔符(通常是分号)。在join的manpage上查看其余内容。如果您需要稍后缩小重复列,请使用cut
。awk -F"," '{print $1","$2","$3",9999"}' f1.csv > newFile;
awk -F"," '{print $1","$2",9999,"$3}' f2.csv >> newFile
让我解释一下这里发生了什么- "-F"指定逗号作为字段分隔符。
对于缺少的列,我用文本9999替换,你可以用任何你喜欢的东西替换。第一个命令将标准输出重定向到一个名为“newFile”的文件中,而第二个命令将标准输出附加到相同的文件中。
希望这可以帮助你,你的问题不太清楚,你想从每个文件中缺少的字段做什么。