Unix:通过保留第一个文件的标题,合并多个具有相同标头的CSV文件

use*_*510 24 unix csv

我必须合并多个具有相同标头的CSV文件.我必须保留第一个文件的标题并删除所有其他文件的标头并合并它们并创建一个主文件.

档案1:

Id,city,name ,location
1,NA,JACK,CA
Run Code Online (Sandbox Code Playgroud)

档案2:

ID,city,name,location
2,NY,JERRY,NY
Run Code Online (Sandbox Code Playgroud)

输出:

Id,city,name,location
1,NA,JACK,CA
2,NY,JERRY,NY
Run Code Online (Sandbox Code Playgroud)

目前我正在使用此代码:

ls *.csv | xargs -n 1 tail -n+2 > master.csv
Run Code Online (Sandbox Code Playgroud)

这段代码将完美地合并文件,但由于我需要第一个文件的标题,这不会给我标题.

我该怎么办?

Vij*_*jay 62

awk 'FNR==1 && NR!=1{next;}{print}' *.csv
Run Code Online (Sandbox Code Playgroud)

在solaris unix上测试:

> cat file1.csv
Id,city,name ,location
1,NA,JACK,CA
>
> cat file2.csv
ID,city,name,location
2,NY,JERRY,NY
>
> nawk 'FNR==1 && NR!=1{next;}{print}' *.csv
Id,city,name ,location
1,NA,JACK,CA
2,NY,JERRY,NY
> 
Run Code Online (Sandbox Code Playgroud)

kevin-d给出的解释:

FNR是当前文件中到目前为止读取的行数(记录).NR是整体读取的行数.因此条件'FNR == 1 && NR!= 1 {next;}'表示,"如果它是当前文件的第一行,则跳过此行,并且至少读取了1行." 这具有打印第一个文件的CSV标题同时在其余文件中跳过它的效果.

链接和之间的区别

  • 说明:FNR是当前文件中到目前为止读取的行数(记录).NR是整体读取的行数.因此条件'FNR == 1 && NR!= 1 {next;}'表示,"如果它是当前文件的第一行,则跳过此行,并且至少读取了1行." 这具有打印第一个文件的CSV标题同时在其余文件中跳过它的效果. (6认同)
  • 对于像我这样的新手......我在最后添加了`> master.csv`来创建包含所有数据的新文件,而不是运行CLI (4认同)