合并多个CSV文件而不合并标题


21

我需要合并多个.CSV文件(使用cat命令),但不复制每个文件的标题。

完成这项任务的最佳方法是什么?

Answers:


32

你需要超过cat命令,描述在这里

假设你有3 CSV-文件:file1.csvfile2.csv,和file3.csv,并希望他们加入到bigfile.csv你的头始终是(只)的第一行,然后使用

任一个(保留第一个文件“ file1.csv”的头):

cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

或(从名称以“ file”开头的所有文件中删除标题):

awk 'FNR > 1' file*.csv > bigfile.csv

4
我发现这是在寻找通用的Linux答案,但就我而言,这并不完全有效。它会默默地忽略file1.csv。我需要整理那个文件。 cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
Lelon

我正在获取tail + 2:当我使用cat <file1.csv <(tail +2 file2.csv)<(tail +2 file3.csv)> bigfile.csv方法时

@ user64636尾号和+2之间应该有一个空格字符
nohillside

其实我不得不用tail -n+2tail +2是行不通的
马修那不勒斯

12

我同意最佳答案,但建议在以下情况下进行扩展(因为我无法评论):

如果您希望输出文件包含标头(一次),则正确的脚本为:

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNR表示单个文件中已处理记录的数量。NR在全局范围内表示它,因此第一行被接受,其余行则像以前一样被忽略。


7

您也可以使用组命令({ ; })代替进程替换(<()):

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

只要文件以空行(\r\n)结尾,它也可用于CRLF行尾。

POSIX 1003.1-2001淘汰了仅数字版本的头和尾,它们在某些环境中会发出警告。


2

需要将具有相同列的两个大型CSV连接到较大的CSV中,以用于分块脚本(数据没有唯一的ID)。

首先从第二个csv中取出标头

awk 'FNR > 1' file2.csv > file2_noheading.csv

接下来,通过以下连接

cat file1.csv file2_noheading.csv > newfile.csv

1

使用上面的命令序列将生成一个如下所示的文件:

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

为了使其具有一个标题行和所有相关值,使其成为正确的CSV,我使用了以下命令sed...sed -ie "/^$/d;/^==>/d" bigfile.csv


0

如果您有大量文件,则更简单的解决方案:

awk 'FNR > 1' *.csv > merged.csv

只需返回以编辑大文件并重新添加标题即可。


您的答案与iolsmit在2013年提出的一切有什么不同awk 'FNR > 1' file*.csv > bigfile.csv?不是!
user3439894 '17

回复:有什么不同?这是一个更简洁的答案,至少是我复制并粘贴的答案:)得到我的认可
Rick Davies

这是一个很好的答案,因为您不需要所有文件开头file
big_smile
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.