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

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)

使用说明

  1. 将上述代码保存为align_csv.py
  2. 执行命令:python3 align_csv.py
  3. 输入文件为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:09:49