You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

命令解释

  1. 在BEGIN块中明确设置RS和ORS,避免命令行参数与脚本逻辑冲突;
  2. NR == 1时直接输出第一个文件的首条记录(包含表头),然后跳过后续处理;
  3. 对后续文件,一旦触发FNR == 1(即每个新文件的首条记录),直接跳过,避免输出重复表头;
  4. 保留原命令中(NR-1)%2{$1=$1}的逻辑,处理需要重新格式化的记录;
  5. 最后1表示输出所有符合条件的记录。

运行该命令后,合并生成的file_to_load.csv会仅保留第一个文件的表头,同时包含两个文件的所有数据行,且完全适配原有RS/ORS的处理规则。

内容的提问来源于stack exchange,提问作者Cristina096

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:05:24