求助:使用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
脚本解释
- BEGIN块:设置输入和输出的分隔符为逗号,适配CSV格式。
- 读取列顺序文件(NR==FNR):处理第一个输入文件
columns.txt时,拆分行内容得到目标列名数组,同时建立列名到输出位置的映射。 - 处理CSV表头(FNR==1):处理
data.csv的第一行,建立原列名到原文件索引的映射,再按目标顺序输出表头。 - 处理数据行:遍历目标列名数组,通过映射找到原文件对应列的值,按顺序拼接输出。
注意事项
- 若CSV包含带逗号的字段(如
"Doe, John"),该基础脚本不支持,需补充更复杂的CSV解析逻辑。 - 确保
columns.txt中的列名和data.csv的表头完全匹配,大小写敏感。
内容的提问来源于stack exchange,提问作者Sumesh
相关产品推荐
相关产品推荐

