【问题标题】:Concatenating CSV files in bash preserving the header only once在bash中连接CSV文件只保留一次标题
【发布时间】:2018-11-14 19:13:31
【问题描述】:

假设我有一个包含许多子目录的目录,每个子目录都包含一些具有相同结构的 CSV 文件(相同的列数并且都包含相同的标题)。

我知道我可以从父文件夹运行类似

find ./ -name '*.csv' -exec cat {} \; > ~/Desktop/result.csv

这会很好用,因为每次都重复标题(每个文件一次)。

我也知道我可以执行sed 1d <filename>tail -n +<N+1> <filename> 之类的操作来跳过文件的第一行。

但就我而言,它似乎更专业一些。我想为第一个文件保留一次标题,然后跳过每个文件的标题。

是否有人知道使用标准 Unix 工具(如 find、head、tail、sed、awk 等)和 bash 实现此目的的方法?

例如输入文件

   /folder1
            /file1.csv
            /file2.csv
   /folder2
            /file1.csv

每个文件都有标题的地方:

A,B,C,每个文件有一个数据行1,2,3

期望的输出是:

A,B,C
1,2,3
1,2,3
1,2,3

标记为重复

我觉得这与 thisthis 等其他问题不同,特别是因为这些解决方案在解决方案中引用了 file1 和 file2。我的问题是关于具有任意数量文件的目录结构,我不想一个一个地输入每个文件。

【问题讨论】:

  • once for the first file 哪个文件是第一个?或者它与获取标题的文件没有区别?
  • 在这种情况下没有区别 :) 所有文件都包含相同的标题,我不介意哪个先出现。
  • 所有链接的问题都不是这个问题的确切副本,因此重新打开。

标签: bash awk sed cat unix-head


【解决方案1】:

你可以使用这个find + xargs + awk:

find . -name '*.csv' -print0 | xargs -0 awk 'NR==1 || FNR>1'

NR==1 || FNR>1 条件将适用于组合输出中的第一行或每个非第一行。

【讨论】:

  • 这假定xargs 可以使用对awk 的一次调用来处理所有文件。
【解决方案2】:
$ {
> cat real-daily-wages-in-pounds-engla.tsv;
> tail -n+2 real-daily-wages-in-pounds-engla.tsv;
> } | cat

您可以通过cat 管道输出多个命令。 tail -n+2 选择文件中的所有行,第一行除外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多