如何按规则拼接目录中CSV文件名:同组逗号分隔,组间空格分隔
按前缀分组CSV文件并格式化输出
你现在的脚本只是简单把所有CSV文件用逗号拼接在一起,没有区分不同前缀的文件组。我们需要先识别每个文件的共同前缀,再把同前缀的文件用逗号连接,不同组之间用空格分隔。这里有两种实用的解决方案:
方案一:Bash循环+参数扩展(可读性高)
这个方案逻辑清晰,通过提取前缀、去重、分组三步完成需求,容易理解和修改:
#!/bin/bash # 初始化结果变量 output="" # 获取所有唯一的文件前缀(去掉最后一个下划线及之后的部分) unique_prefixes=$(for file in *.csv; do echo "${file%_*.csv}"; done | sort -u) # 遍历每个前缀,生成对应的文件组 for prefix in $unique_prefixes; do # 找到当前前缀的所有CSV文件,用逗号连接 file_group=$(ls "${prefix}"_*.csv | tr '\n' ',' | sed 's/,$//') # 将当前组添加到输出结果,用空格分隔 output="${output} ${file_group}" done # 移除开头多余的空格并输出最终结果 echo "${output# }"
代码细节说明:
${file%_*.csv}:Bash参数扩展语法,从文件名末尾删除最短匹配的_*.csv模式,精准提取出usa_la2_sky这类共同前缀。sort -u:对提取的前缀排序并去重,确保每个前缀只被处理一次。tr '\n' ',':把ls输出的每行文件名转换成逗号分隔的字符串。sed 's/,$//':移除字符串末尾多余的逗号,避免分组后出现无效的 trailing comma。${output# }:移除结果开头的空格,避免第一个文件组前出现多余空格。
方案二:Awk单行命令(简洁高效)
如果偏好更紧凑的写法,可以用Awk一次性完成分组和格式化:
ls *.csv | awk -F'_' '{prefix = $1 "_" $2 "_" $3} {groups[prefix] = groups[prefix] ? groups[prefix] "," $0 : $0} END {for (p in groups) printf "%s ", groups[p]; print ""}' | sed 's/ $//'
代码细节说明:
-F'_':用下划线作为字段分隔符,把文件名拆分成多个部分。prefix = $1 "_" $2 "_" $3:根据你的文件名格式(前缀_序号.csv),拼接前三个字段得到唯一前缀。groups[prefix] = ...:用数组存储每个前缀对应的文件组,已有内容时追加逗号和新文件名,否则直接赋值当前文件名。END块:遍历数组输出所有分组,用空格分隔,最后用sed移除末尾多余的空格。
运行以上任意一种方案,都能得到你期望的输出:
usa_la2_sky_1.csv,usa_la2_sky_2.csv usa_nyc1_sky_1.csv,usa_nyc1_sky_2.csv
内容的提问来源于stack exchange,提问作者sksahu
相关产品推荐
相关产品推荐

