如何将csv文件中的行合并到一个文件中,不包括标题行

时间:2016-12-01 23:22:19

标签: linux bash unix

我有许多使用以下格式的csv文件:

file_1.csv
line 1 -- header row
line 2 -- header row
line 3 -- data row

file_2.csv
line 1 -- header row
line 2 -- header row
line 3 -- data row
...
file_n.csv
line 1 -- header row
line 2 -- header row
line 3 -- data row

并希望编写一些内容,将它们全部放在一个文件中,只有两个标题行只复制一次,如下所示:

fileMerged.csv
line 1 -- header row
line 2 -- header row
line 3 -- data row from file_1
line 4 -- data row from file_2
...
line n+2 -- data row from file_n

在Linux服务器中实现此目的的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

使用awk:

awk 'FNR==NR||FNR>2' file_*.csv > fileMerged.csv

答案 1 :(得分:1)

#!/usr/bin/env bash

files=( file_*.csv ) # collect input filenames in an array

{
  head -n 2 "${files[0]}" # output the header lines (using the 1st file)
  tail -q -n +3 "${files[@]}" # append the data lines from all files, in sequence
}  > out.csv

lihao's elegant answer提供了一个更简单的解决方案,显然满足了OP的要求。

如果您对问题的 变体感兴趣,那么行应该从输入文件循环复制 strong>:来自每个输入文件的各自的第一行,后面是相应的第二行,......:

#!/usr/bin/env bash

files=( file_*.csv ) # collect input filenames in an array

{
  head -n 2 "${files[0]}" # output the header lines (using the 1st file)
  paste -d'\n' "${files[@]}" | tail -n +"$(( 1 + 2 * ${#files[@]} ))"
}  > out.csv