Linux环境下CSV文件行对齐处理需求(支持Bash/Python)
解决CSV多列数据对齐问题:将相同值归到同一行
针对你描述的三列CSV因缺失导致数据错位,需要将相同值统一放到同一行(对应位置补空白,不新增值)的需求,以下提供两种无需第三方工具的实现方案:
方案一:Python 实现(易读易维护)
利用Python内置的csv模块和OrderedDict保证值的首次出现顺序,代码逻辑清晰,适合后续扩展:
import csv from collections import OrderedDict # 存储值的首次出现顺序,以及对应出现的列索引 value_info = OrderedDict() # 读取输入CSV文件 with open('input.csv', 'r') as input_file: csv_reader = csv.reader(input_file) for row in csv_reader: # 清理空字符串并补全到三列,处理行长度不足或末尾多余逗号的情况 cleaned_cols = [col.strip() for col in row if col.strip()] while len(cleaned_cols) < 3: cleaned_cols.append('') # 记录每个值出现的列 for col_idx, val in enumerate(cleaned_cols[:3]): if val: if val not in value_info: value_info[val] = set() value_info[val].add(col_idx) # 生成对齐后的输出行 output_rows = [] for val, col_indices in value_info.items(): new_row = ['', '', ''] for idx in col_indices: new_row[idx] = val output_rows.append(new_row) # 写入输出CSV文件 with open('output.csv', 'w', newline='') as output_file: csv_writer = csv.writer(output_file) csv_writer.writerows(output_rows)
使用说明
- 将上述代码保存为
align_csv.py - 执行命令:
python3 align_csv.py - 输入文件为
input.csv,输出结果会写入output.csv
方案二:Awk 实现(Linux原生工具,快速处理)
利用Linux自带的Awk工具,无需额外依赖,适合在终端快速处理:
编写Awk脚本
将以下内容保存为align_csv.awk:
BEGIN { FS = "," OFS = "," seq = 0 } { # 清理每列的空白并处理空值 col1 = ($1 ~ /^[[:space:]]*$/ ? "" : $1) col2 = ($2 ~ /^[[:space:]]*$/ ? "" : $2) col3 = ($3 ~ /^[[:space:]]*$/ ? "" : $3) # 记录值的首次出现顺序 if (col1 != "" && !seen[col1]) { seen[col1] = 1 order[++seq] = col1 } if (col2 != "" && !seen[col2]) { seen[col2] = 1 order[++seq] = col2 } if (col3 != "" && !seen[col3]) { seen[col3] = 1 order[++seq] = col3 } # 记录值出现的列 if (col1 != "") cols[col1] = cols[col1] "1" if (col2 != "") cols[col2] = cols[col2] "2" if (col3 != "") cols[col3] = cols[col3] "3" } END { # 生成对齐后的行并输出 for (i = 1; i <= seq; i++) { val = order[i] c1 = index(cols[val], "1") ? val : "" c2 = index(cols[val], "2") ? val : "" c3 = index(cols[val], "3") ? val : "" print c1, c2, c3 } }
使用说明
在终端执行命令:
awk -f align_csv.awk input.csv > output.csv
两种方案均会按照值在原文件中首次出现的顺序生成对齐后的行,确保相同值出现在同一行的对应列,其余列留空。
内容的提问来源于stack exchange,提问作者Arindrew
相关产品推荐
相关产品推荐

