如何用两种分隔符对行内条目排列组合并输出分类信息?
问题描述
我的数据集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"
代码说明
- 拆分行内容:用
IFS=';'将每行拆分为条目部分entries和分类信息category,彻底分离两类内容。 - 清理条目空格:通过
xargs去除每个条目的首尾空格,避免输出出现多余空格。 - 生成两两组合:嵌套循环遍历所有i<j的条目对,每对后追加分类信息,用制表符分隔列。
内容的提问来源于stack exchange,提问作者lukascbossert
相关产品推荐
相关产品推荐

