Bash中合并同前缀CSV文件并保留单个表头的问题
解决CSV合并时表头重复的AWK命令问题
我有两个前缀为orderline_、列数相同的.csv文件,需要合并为一个文件,但仅保留第一个文件的表头。原脚本用于处理单个文件,修改后的AWK命令出现表头重复的问题,现求助符合原有RS和ORS设置的正确命令。
文件示例
- orderline_123456.csv:
Order_number,Quantity,Price 100,10,25.3 101,15,30.2
- orderline_896524.csv:
Order_number,Quantity,Price 102,20,12.33 103,3,3.4
期望与现有问题
期望输出file_load.csv仅保留一个表头,包含所有数据行。
原处理单个文件的命令:
'(NR-1)%2{$1=$1}1' RS=\" ORS=\" orderline_*.csv >> file_to_load.csv
修改后尝试跳过后续文件表头的命令(出现表头重复问题):
'FNR == 1 && NR != 1 {next} (NR-1)%2{$1=$1}1' RS=\" ORS=\" orderline_*.csv >> file_to_load.csv
问题原因与解决方案
问题出在RS和ORS设置为双引号"后,AWK不再按行分割记录,而是把双引号包裹的内容当作一条记录——这导致FNR == 1的判断逻辑完全失效,因为第一个文件的表头并非第一条"记录"。
以下是适配原有RS/ORS设置的正确命令:
BEGIN { RS="\""; ORS="\"" } NR == 1 { print; next } FNR == 1 { next } (NR-1)%2 { $1=$1 } 1
或者更简洁的写法:
BEGIN { RS="\""; ORS="\"" } !(FNR == 1 && NR > 1) { if ((NR-1)%2) $1=$1 print }
命令解释
- 在
BEGIN块中明确设置RS和ORS,避免命令行参数与脚本逻辑冲突; NR == 1时直接输出第一个文件的首条记录(包含表头),然后跳过后续处理;- 对后续文件,一旦触发
FNR == 1(即每个新文件的首条记录),直接跳过,避免输出重复表头; - 保留原命令中
(NR-1)%2{$1=$1}的逻辑,处理需要重新格式化的记录; - 最后
1表示输出所有符合条件的记录。
运行该命令后,合并生成的file_to_load.csv会仅保留第一个文件的表头,同时包含两个文件的所有数据行,且完全适配原有RS/ORS的处理规则。
内容的提问来源于stack exchange,提问作者Cristina096
相关产品推荐
相关产品推荐

