如何将TSV文件列号生成为逗号分隔的变量?
解决TSV列号生成逗号分隔字符串的问题
问题分析
你当前的代码核心问题在于最后输出时错误地使用数组语法访问普通字符串变量comma_arr,同时可以简化实现逻辑,避免不必要的数组操作。
最简解决方案
直接使用seq的分隔符参数生成逗号分隔字符串,无需数组:
# 获取TSV文件的最大列数 clm=$(awk -F'\t' '{print NF}' clm.tsv | sort -nu | tail -n 1) # 生成逗号分隔的列号字符串 comma_arr=$(seq -s ',' 1 "$clm") # 验证结果 echo "$comma_arr"
执行后comma_arr的值就是1,2,3,4,完全符合需求。
修复你原有代码的版本
如果坚持使用数组实现,需注意直接输出字符串变量而非用数组语法访问:
clm=$(awk -F'\t' '{print NF}' clm.tsv | sort -nu | tail -n 1) arr=($(seq 1 "$clm")) # 设置IFS为逗号并拼接数组元素 IFS=',' comma_arr="${arr[*]}" # 直接输出变量,不要用数组的[*]或[@]语法 echo "$comma_arr"
关键说明
seq -s ',' 1 N可以直接生成1,2,...,N格式的字符串,是最简洁的实现方式。- 你之前执行
echo "${comma_arr[*]}"时,因为comma_arr是普通字符串,shell会按默认IFS(包含换行、空格等)拆分输出,导致每行一个数字,正确做法是直接输出变量本身echo "$comma_arr"。
内容的提问来源于stack exchange,提问作者sasa.asa
相关产品推荐
相关产品推荐

