我有许多使用以下格式的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服务器中实现此目的的最佳方法是什么?
答案 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