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

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

脚本说明

  1. CSV处理:用awk直接解析CSV,指定分隔符为逗号,去除字段的引号,跳过首行后输出成对的项目名和卷名
  2. 循环读取:通过while read -r proj vol逐行读取每一对字段,确保循环内同时拿到项目名和卷名
  3. 命令执行与拼接:执行目标命令(这里用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:36:34