bash - 合并 CSV 文件 : Appending instead of merging

标签 bash shell unix csv merge

所以基本上我想合并几个 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 -1head -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 headman tail(有些版本允许head -1,其他的头-n 1)...

关于bash - 合并 CSV 文件 : Appending instead of merging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24641948/

相关文章:

linux - 创建运行手册以执行 bash 脚本

linux - 在 Bash 中模拟一个微调器以取得进步

bash - docker alpine/bin/sh script.sh 未找到

performance - 如何清除 MacOSX 上的目录/inode 缓存

linux - 忽略linux脚本中的tee

unix - 在grep中组合-v标志和-A标志

linux - 如何在 bash 中同步处理 2 个范围/列表

bash - 如何从文件加载 bash 命令历史

linux - 如何编写文件创建脚本?

linux - 多级单亲单子(monad)进程树?