所以基本上我想合并几个 CSV 文件。我正在使用以下脚本来执行此操作:
paste -d , *.csv > final.txt
然而,这在过去对我有用,但这次不起作用。它将数据附加到彼此旁边而不是彼此下方。例如两个包含以下格式记录的文件
CreatedAt ID
Mon Jul 07 20:43:47 +0000 2014 4.86249E+17
Mon Jul 07 19:58:29 +0000 2014 4.86238E+17
Mon Jul 07 19:42:33 +0000 2014 4.86234E+17
合并时给予
CreatedAt ID CreatedAt ID
Mon Jul 07 20:43:47 +0000 2014 4.86249E+17 Mon Jul 07 18:25:53 +0000 2014 4.86215E+17
Mon Jul 07 19:58:29 +0000 2014 4.86238E+17 Mon Jul 07 17:19:18 +0000 2014 4.86198E+17
Mon Jul 07 19:42:33 +0000 2014 4.86234E+17 Mon Jul 07 15:45:13 +0000 2014 4.86174E+17
Mon Jul 07 15:34:13 +0000 2014 4.86176E+17
有人知道这是什么原因吗?或者我可以做些什么来强制合并以下记录?
最佳答案
假设所有的 csv 文件都具有相同的格式并且都以相同的标题开头, 您可以编写一个如下所示的小脚本来将所有文件附加到一个文件中 并且只使用一次 header 。
#!/bin/bash
OutFileName="X.csv" # Fix the output name
i=0 # Reset a counter
for filename in ./*.csv; do
if [ "$filename" != "$OutFileName" ] ; # Avoid recursion
then
if [[ $i -eq 0 ]] ; then
head -1 "$filename" > "$OutFileName" # Copy header if it is the first file
fi
tail -n +2 "$filename" >> "$OutFileName" # Append from the 2nd line each file
i=$(( $i + 1 )) # Increase the counter
fi
done
注意事项:
head -1
或head -n 1
命令打印文件的第一行(head)。tail -n +2
从第 2 行开始打印文件的尾部 (+2
)- 测试
[ ... ]
用于从输入列表中排除输出文件。 - 每次都重写输出文件。
- 命令
cat a.csv b.csv > X.csv
可以简单地用于将 a.csv 和 b csv 附加到单个文件中(但您复制了 2 次标题)。
paste
命令将文件一个粘贴到另一个。如果文件的行有空格,您可以获得上面报告的输出。
-d ,
的使用要求paste command
来定义用逗号,
分隔的字段,但是格式不是这样您在上面报告的文件。
cat
命令改为连接文件并在标准输出上打印,这意味着它一个接一个地写入文件。
单个选项的语法引用man head
或man tail
(有些版本允许head -1
,其他的头-n 1
)...
关于bash - 合并 CSV 文件 : Appending instead of merging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24641948/