Bash脚本实现:遍历CSV两列并合并命令输出为单行
Bash脚本实现:CSV字段与命令结果单行合并输出
需求
从CSV文件中提取第2列(项目名称)和最后一列(卷名称),对每个卷执行指定命令后,将项目名、卷名、命令输出合并为单行输出,明确每个项目对应的关联数据。期望输出格式示例:
d62320:fxn3008_d62320:/q/volset/fxn3008_d62320
原脚本问题分析
你提供的现有脚本存在几个关键问题:
- 将所有项目名和卷名拼接成一维字符串,循环时只能逐个读取单个字段,无法同时获取一对项目名和卷名
- 循环内的
$2和$NF是Bash位置参数,并非CSV的字段变量,完全无效 - 没有正确捕获命令输出并与字段拼接
修正后的脚本
#!/bin/bash # 处理CSV:提取第2列和最后一列,去除引号,跳过首行,取前5行后逐行处理 awk -F ',' '{ gsub(/"/, "", $2); # 去除项目名称的引号 gsub(/"/, "", $NF); # 去除卷名称的引号 if (NR > 1) print $2, $NF # 跳过首行,打印成对字段 }' ldap-project-nismap.csv | head -5 | while read -r proj vol; do # 执行目标命令(示例为locate),捕获输出 cmd_result=$(locate "$vol") # 按期望格式拼接输出,若命令无输出则保持格式 echo "$proj:$vol:$cmd_result" done
脚本说明
- CSV处理:用
awk直接解析CSV,指定分隔符为逗号,去除字段的引号,跳过首行后输出成对的项目名和卷名 - 循环读取:通过
while read -r proj vol逐行读取每一对字段,确保循环内同时拿到项目名和卷名 - 命令执行与拼接:执行目标命令(这里用
locate示例)并捕获结果,最后按项目名:卷名:命令输出的格式输出单行内容
测试数据示例
若CSV数据为:
"DC_oregon-DC01",dnpc,"dbc2002:/proj/dbc2002_dnpc_eaeagle_pd2/q",1000,"761.87",76,economy,"eaeagle_pd2","dbc2002_dnpc_eaeagle_pd2" "DC_oregon-DC01",dnpc,"dbc2002:/proj/dbc2002_dnpc_eaeagle2_7/q",4096,"3536.99",86,scratch,"eaeagle2_7","dbc2002_dnpc_eaeagle2_7"
脚本会输出类似:
dnpc:dbc2002_dnpc_eaeagle_pd2:/path/to/dbc2002_dnpc_eaeagle_pd2 dnpc:dbc2002_dnpc_eaeagle2_7:/path/to/dbc2002_dnpc_eaeagle2_7
内容的提问来源于stack exchange,提问作者user294110
相关产品推荐
相关产品推荐

