Bash如何根据指定列名提取CSV文件内容生成新文件
按列名提取CSV指定列的几种实现方式
方法1:使用awk(系统自带无需额外安装)
awk可以直接匹配表头定位列位置,不需要依赖第三方工具,适配没有安装权限的环境,命令如下:
awk -F ',' 'BEGIN{ # 在这里定义需要提取的列名 cols["First Name"]=1 cols[" Last Name"]=1 cols[" Nickname"]=1 } NR==1{ # 遍历表头获取对应列的序号 for(i=1;i<=NF;i++){ if(cols[$i]){ col_idx[i]=1 printf "%s,",$i } } print "" } NR>1{ # 遍历字段输出对应列内容 for(i=1;i<=NF;i++){ if(col_idx[i]){ printf "%s,",$i } } print "" }' input.csv | sed 's/,$//' > output.csv
注意:如果你的CSV字段内部包含逗号、换行符等特殊字符,这个简易awk方案不适用,建议使用后面的专用CSV处理方案
方法2:使用csvkit专用CSV处理工具
csvkit是专门面向CSV文件的命令行工具集,其中的csvcut命令原生支持按列名提取字段,用法和你预想的cut逻辑几乎一致:
- 先安装csvkit:
- Debian/Ubuntu系:
sudo apt install csvkit - 全平台通用(有Python环境):
pip install csvkit
- Debian/Ubuntu系:
- 提取列命令:
csvcut -c "First Name, Last Name, Nickname" input.csv > output.csv
这个方案原生支持带特殊字符的标准CSV格式,兼容性最好。
方法3:使用Python快速实现
如果不想额外安装工具,也可以写几行Python脚本实现,依赖Python标准库的csv模块,天然支持标准CSV格式:
import csv # 配置需要保留的列名,注意和表头的空格完全匹配 keep_cols = ["First Name", " Last Name", " Nickname"] with open("input.csv", "r", encoding="utf-8") as infile, open("output.csv", "w", encoding="utf-8", newline="") as outfile: reader = csv.DictReader(infile) writer = csv.DictWriter(outfile, fieldnames=keep_cols) writer.writeheader() for row in reader: writer.writerow({col: row[col] for col in keep_cols})
直接运行上述脚本即可得到目标文件。
内容的提问来源于stack exchange,提问作者Mahmoud Abdulkarim
相关产品推荐
相关产品推荐

