Linux下合并行数不等的CSV文件时填充NULL至空单元格的方法
合并行数不等的CSV并填充NULL的Linux命令
假设两个目标CSV文件分别为a.csv(5行)和b.csv(4行),可以通过以下命令实现合并时用NULL填充短文件的缺失行:
步骤1:定义关键变量(也可整合为单条命令)
# 获取两个文件的行数 lines_a=$(wc -l < a.csv) lines_b=$(wc -l < b.csv) # 取两个文件的最大行数作为合并后的目标总行数 max_lines=$(( lines_a > lines_b ? lines_a : lines_b )) # 获取b.csv的列数,用于生成对应数量的NULL字符串 cols_b=$(head -n1 b.csv | awk -F, '{print NF}') # 生成与b.csv列数匹配的NULL字符串(列间用逗号分隔) null_str=$(printf 'NULL,'%.0s $(seq 1 $cols_b) | sed 's/,$//')
步骤2:合并文件并补全缺失行
paste a.csv <(awk -v max="$max_lines" -v null="$null_str" 'NR <= max {print; next} {print null}' b.csv) > merged.csv
说明
paste命令负责按列合并两个文件的内容;<(...)是Linux的进程替换特性,将awk处理后的b.csv内容作为临时输入源;awk会遍历b.csv的每一行:当行数未达到max_lines时直接输出原行,否则输出预先生成的全NULL行;- 如果
a.csv是行数较短的文件,只需互换命令中a.csv和b.csv的位置,并将变量调整为cols_a(获取a.csv的列数)即可。
内容的提问来源于stack exchange,提问作者Vyshnavi Vyshu
相关产品推荐
相关产品推荐

