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

如何用两种分隔符对行内条目排列组合并输出分类信息?

问题描述

我的数据集dataset.csv结构如下:

NFDI4Culture, NFDI4Memory, NFDI4Objects, Text+;Alliance
BERD@NFDI, Text+;Event: conference organisation
NFDI4Cat, NFDI4Chem, FAIRmat, DAPHNE4NFDI;Event: conference participation
PUNCH4NFDI, FAIRmat, DAPHNE4NFDI;Event: conference participation

每行规则:

  • 包含至少两个用,分隔的条目
  • 行尾用;分隔条目对应的分类信息

期望输出(列以制表符分隔):

NFDI4Culture  NFDI4Memory  Alliance
NFDI4Culture  NFDI4Objects  Alliance
NFDI4Culture  Text+  Alliance
NFDI4Memory  NFDI4Objects  Alliance
NFDI4Memory  Text+  Alliance
NFDI4Objects  Text+  Alliance
BERD@NFDI  Text+  Event: conference organisation
NFDI4Cat  NFDI4Chem  Event: conference organisation
NFDI4Cat  FAIRmat  Event: conference organisation
NFDI4Cat  DAPHNE4NFDI  Event: conference organisation
NFDI4Chem  FAIRmat  Event: conference organisation
NFDI4Chem  DAPHNE4NFDI  Event: conference organisation
FAIRmat  DAPHNE4NFDI  Event: conference organisation
PUNCH4NFDI  FAIRmat  Event: conference organisation
PUNCH4NFDI  DAPHNE4NFDI  Event: conference organisation
FAIRmat  DAPHNE4NFDI  Event: conference organisation

需求:对每行中,分隔的条目做两两组合,每条结果末尾追加对应的分类信息。

我复用了一段旧Bash代码,结果接近需求但分类信息未正确输出到每条结果末尾:

while IFS=\,  read -r -a names; do
        for ((i = 0; i < ${#names[@]} - 1; ++i)); do
            for ((j = i + 1; j < ${#names[@]}; ++j)); do
                echo -e "${names[i]}\t${names[j]}"
            done
        done
done < $dataset

当前输出问题:分类信息被绑定在最后一个条目中,没有独立作为第三列追加到所有组合行末尾。

修正后的Bash脚本

核心问题是原代码未拆分;分隔符,导致分类信息和条目混在一起。修正思路:先按;拆分每行,分离条目列表与分类信息,再生成条目两两组合,最后将分类信息追加到每行末尾。

修正后的代码:

#!/bin/bash
dataset="dataset.csv"

while IFS=';' read -r entries category; do
    # 按逗号拆分条目,同时去除每个条目的首尾空格
    IFS=',' read -r -a name_array <<< "$entries"
    # 遍历生成两两组合
    for ((i = 0; i < ${#name_array[@]} - 1; i++)); do
        name_i=$(echo "${name_array[i]}" | xargs)
        for ((j = i + 1; j < ${#name_array[@]}; j++)); do
            name_j=$(echo "${name_array[j]}" | xargs)
            # 输出三列:条目1、条目2、分类信息,制表符分隔
            echo -e "${name_i}\t${name_j}\t${category}"
        done
    done
done < "$dataset"
代码说明
  1. 拆分行内容:用IFS=';'将每行拆分为条目部分entries和分类信息category,彻底分离两类内容。
  2. 清理条目空格:通过xargs去除每个条目的首尾空格,避免输出出现多余空格。
  3. 生成两两组合:嵌套循环遍历所有i<j的条目对,每对后追加分类信息,用制表符分隔列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:51:04