编写Bash脚本提取数组中CSV条目首次唯一出现及重复项
Bash脚本实现CSV路径去重与重复收集
给定按日期从新到旧排序的数组array1:
array1=(url://root/sub1/sub2/2022-10-22/ a.csv/ b.csv/ url://root/sub1/sub2/2022-09-22/ a.csv/ b.csv/ url://root/sub1/sub2/2022-08-22/ a.csv/ b.csv/ c.csv/ d.csv/ url://root/sub1/sub2/2022-07-22/ a.csv/)
需要编写Bash脚本完成两个任务:
- 生成数组
array2,包含每个CSV文件首次(最新)出现的完整路径,结果如下:
array2=(url://root/sub1/sub2/2022-10-22/a.csv/ url://root/sub1/sub2/2022-10-22/b.csv/ url://root/sub1/sub2/2022-08-22/c.csv/ url://root/sub1/sub2/2022-08-22/d.csv/)
- 生成数组
array3,包含所有重复出现的CSV文件完整路径,结果如下:
array3=(url://root/sub1/sub2/2022-09-22/a.csv/ url://root/sub1/sub2/2022-09-22/b.csv/ url://root/sub1/sub2/2022-08-22/a.csv/ url://root/sub1/sub2/2022-08-22/b.csv/ url://root/sub1/sub2/2022-07-22/a.csv/)
实现思路
遍历数组时,先识别日期路径前缀(包含YYYY-MM-DD格式且以/结尾的项),后续的CSV文件名与当前前缀拼接成完整路径。用关联数组记录已出现的CSV文件名:遇到新CSV就加入array2并标记已存在;遇到已存在的CSV则加入array3。
完整脚本
#!/bin/bash # 原始数组 array1=(url://root/sub1/sub2/2022-10-22/ a.csv/ b.csv/ url://root/sub1/sub2/2022-09-22/ a.csv/ b.csv/ url://root/sub1/sub2/2022-08-22/ a.csv/ b.csv/ c.csv/ d.csv/ url://root/sub1/sub2/2022-07-22/ a.csv/) # 初始化变量 declare -A seen_csv # 记录已出现的CSV文件名 current_prefix="" # 当前日期路径前缀 array2=() # 存储首次出现的完整路径 array3=() # 存储重复的完整路径 # 遍历数组元素 for item in "${array1[@]}"; do # 判断当前项是否是日期路径前缀 if [[ "$item" =~ [0-9]{4}-[0-9]{2}-[0-9]{2}/$ ]]; then current_prefix="$item" continue fi # 拼接完整路径 full_path="${current_prefix}${item}" # 提取纯CSV文件名(去除前后的/) csv_name=$(echo "$item" | sed 's/^\/\|\/$//g') # 判断是否已见过该CSV if [[ -z "${seen_csv[$csv_name]}" ]]; then array2+=("$full_path") seen_csv[$csv_name]=1 else array3+=("$full_path") fi done # 输出结果验证 echo "array2内容:" printf "%s\n" "${array2[@]}" echo -e "\narray3内容:" printf "%s\n" "${array3[@]}"
运行结果
执行脚本后,输出的array2和array3将与需求示例完全匹配。
内容的提问来源于stack exchange,提问作者digitvldvl
相关产品推荐
相关产品推荐

