unix 将两个.csv文件合并为一个,并在bash中只保留一个头文件,

6g8kf2rb  于 2022-11-23  发布在  Unix
关注(0)|答案(3)|浏览(250)

我在同一个目录中有两个列数相同的.csv文件,我想将它们合并成一个文件,但只保留第一个文件的一个标题。文件名总是不同的,只有前缀保持不变:
第一个
输出文件应如下所示:

file_load.csv

Order_number,Quantity,Price
100,10,25.3
101,15,30.2
102,20,12.33
103,3,3.4

这已经在shell脚本文件中了,因为现在我只需要一个文件,但是现在我必须合并两个文件:

awk '(NR-1)%2{$1=$1}1' RS=\" ORS=\" orderline_*.csv >> file_to_load.csv

我试着把它改成

awk 'FNR == 1 && NR != 1 {next} (NR-1)%2{$1=$1}1' RS=\" ORS=\" orderline_*.csv >> file_to_load.csv

但是在输出中我得到了两次头。
你能帮我一下吗?这个命令应该是什么样子的?我需要保留它以前的定义。
谢谢你,谢谢你

83qze16e

83qze16e1#

你要找的

awk 'NR == 1 || FNR > 1' file ...

NR是所看到的所有记录的计数,以及
FNR是当前文件的记录号。

0lvr5msh

0lvr5msh2#

有时解决办法是把任务分成简单的步骤

1.获取第一行,即表头并存储为变量

https://stackoverflow.com/a/2439587/3957754

header=$(head -n 1 file1.csv)

2.获取文件中除第一行以外的所有行

How to tail all lines except first row

body=$(tail -n+2 file1.csv)

对两个文件重复此操作

3.将标题和n个正文连接起来

csv_merger.sh

header=$(head -n 1 file1.csv)
body1=$(tail -n+2 file1.csv)
body2=$(tail -n+2 file2.csv)
echo "$header" > merged.csv
echo "$body1" >> merged.csv
echo "$body2" >> merged.csv

测试结果

您可以扩展此脚本以处理更多文件

rqdpfwrv

rqdpfwrv3#

使用方便的csvkit package中的csvstack是合并具有相同列的CSV文件的一种方法:

$ csvstack orderline_123456.csv orderline_896524.csv > file_load.csv

相关问题