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

求助:使用Unix/Awk按指定列顺序重排CSV文件

用Awk按指定列顺序重排CSV文件

假设我们有以下文件:

待处理CSV(data.csv)

Name,Age,City,Email
Alice,30,New York,alice@example.com
Bob,25,London,bob@example.com

指定列顺序文件(columns.txt)

Email,Name,City,Age

期望输出

Email,Name,City,Age
alice@example.com,Alice,New York,30
bob@example.com,Bob,London,25

解决方案:Awk脚本

创建一个Awk脚本(reorder_csv.awk):

BEGIN {
    FS = ","
    OFS = ","
}

# 读取列顺序文件,存储目标列名和对应的输出位置
NR == FNR {
    split($0, target_cols, ",")
    for (i in target_cols) {
        target_pos[target_cols[i]] = i
    }
    next
}

# 处理CSV表头,建立原列名到原索引的映射
FNR == 1 {
    for (i = 1; i <= NF; i++) {
        col_index[$i] = i
    }
    # 输出目标表头
    for (i = 1; i <= length(target_cols); i++) {
        if (i > 1) printf OFS
        printf target_cols[i]
    }
    print ""
    next
}

# 处理数据行,按目标顺序输出
{
    for (i = 1; i <= length(target_cols); i++) {
        col_name = target_cols[i]
        if (i > 1) printf OFS
        printf $(col_index[col_name])
    }
    print ""
}

运行命令

awk -f reorder_csv.awk columns.txt data.csv

脚本解释

  1. BEGIN块:设置输入和输出的分隔符为逗号,适配CSV格式。
  2. 读取列顺序文件(NR==FNR):处理第一个输入文件columns.txt时,拆分行内容得到目标列名数组,同时建立列名到输出位置的映射。
  3. 处理CSV表头(FNR==1):处理data.csv的第一行,建立原列名到原文件索引的映射,再按目标顺序输出表头。
  4. 处理数据行:遍历目标列名数组,通过映射找到原文件对应列的值,按顺序拼接输出。

注意事项

  • 若CSV包含带逗号的字段(如"Doe, John"),该基础脚本不支持,需补充更复杂的CSV解析逻辑。
  • 确保columns.txt中的列名和data.csv的表头完全匹配,大小写敏感。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:05:03