【问题标题】:How to ignore headers when merging single column of multiple CSV files?合并多个 CSV 文件的单列时如何忽略标题?
【发布时间】:2017-05-10 16:40:31
【问题描述】:

我需要合并来自多个 CSV 文件的单个列,同时忽略标题。

文件 1:

id,backer_uid,fname,lname
123,uj2uj2,JOHN,SMITH

文件 2:

id,backer_uid,fname,lname
124,uj2uh3,BRIAN,DOOLEY

输出:

JOHN
BRIAN

目前,我正在使用:

/*Merge 3rd column from all csv files*/

awk -F "\"*,\"*" '{print $3}’ *.csv >merged.csv

但是如何忽略标题?

【问题讨论】:

  • 文件是否应该超过一行? (不包括标题),如果是这样,输出应该是什么?
  • 合并后的文件将包含与所有文件的组合 fname 列中 fname 的行数一样多的行。所以输出应该只是单列中的名称。在这种情况下,将有两个名称。约翰和布莱恩。

标签: bash csv unix


【解决方案1】:

您可以使用 awk 执行此操作,几乎就像您已经完成的那样,通过在 FNR(每个文件的记录号)上添加一个条件:

awk -F, 'FNR > 1 {print $3}' *.csv > merged.csv

【讨论】:

  • 完美。谢谢。
【解决方案2】:

使用tailcut

tail -q -n +2 *.csv | cut -f3 -d, > merged.csv
  • tail -n +2 打印从第 2 行开始的所有文件行
  • -q 禁止打印文件名
  • cut -f3 -d, 提取第三个字段,将, 视为分隔符

【讨论】:

  • 谢谢。为了帮助我理解,你能解释一下+2-f3指的是什么吗?
【解决方案3】:

试试:如果你只需要读取 2 个文件。

awk -F, 'FNR>1{print $(NF-1)}' file[12]

在这里,我将字段分隔符设为逗号,然后检查行号是否大于 1,然后打印倒数第二个字段。这里要注意的一点是file[12] 只会读取名为file1 和file2 的文件,如果你有更多的文件使用file* 那么。

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2016-06-18
    • 2012-12-08
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多