如何合并行数不同且含注释的类CSV文件?
合并不同行数的带注释CSV文件问题
问题背景
示例文件内容
- file1:
# dsd # dsd 1,2,5 2,3,5 1,2,5 2,3,5 3,4,5 3,4,5
- file2:
# s 1,2 1,2
期望输出
# dsd # dsd 1,2,5,1,2 2,3,5,1,2 1,2,5,, 2,3,5,, 3,4,5,, 3,4,5,,
核心需求
- 保留file1中所有以
#开头的注释行 - 注释行之后,将file2的非注释行追加为新列
- 当file2数据行不足时,用空值补全至file1的总行数
- 忽略file2中的注释行
用户尝试的命令及错误
用户尝试使用以下命令:
paste $(grep -v '^#' file1) file2
触发错误提示:
bash: /usr/bin/paste: Argument list too long
简便解决方案:用awk实现
直接用awk即可完成需求,无需复杂脚本或Python代码,以下是实现方案:
完整awk脚本
BEGIN { FS=OFS="," } # 先读取file2的非注释行存入数组 NR == FNR { if ($0 !~ /^#/) { arr[++n] = $0 } next } # 处理file1的内容 { # 注释行直接输出 if ($0 ~ /^#/) { print $0 next } # 非注释行追加file2对应行内容,无数据则补空 print $0, (++i <= n ? arr[i] : "") }
使用方法
将上述代码保存为merge_csv.awk,执行命令:
awk -f merge_csv.awk file2 file1
或者直接用一行命令执行:
awk 'BEGIN{FS=OFS=","} NR==FNR{if($0!~/^#/){arr[++n]=$0} next} {if($0~/^#/){print $0;next} print $0, (++i<=n?arr[i]:"")}' file2 file1
代码逻辑说明
- BEGIN块:设置输入输出分隔符为逗号,保证CSV格式的一致性
- NR==FNR块:仅处理第一个输入文件(file2),将所有非注释行存入数组
arr,并记录有效行数n - 处理file1块:
- 遇到注释行直接打印输出
- 非注释行按顺序匹配
arr中的内容,当行数超过file2的有效行数时,追加空字符串,自动生成,,的空列格式
这种方法既避免了paste命令的参数过长问题,又能精准满足所有需求。
内容的提问来源于stack exchange,提问作者atapaka
相关产品推荐
相关产品推荐

