如何对CSV文件中Department列值去重后拼接为单个字段?
解决方案
以下几种方法可以实现CSV中Department列的去重并拼接为Fin Tech/HR格式:
方法1:使用Shell工具链(简洁高效)
awk -F ',' 'NR>1 {gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2); print $2}' your_file.csv | sort -u | paste -sd '/' -
步骤解析:
awk -F ',' 'NR>1 {gsub(...); print $2}':跳过表头,提取第二列并去除首尾空格sort -u:对提取的部门值排序并去重paste -sd '/' -:将所有去重后的行用/连接成单行
方法2:纯Awk实现(保持首次出现顺序)
如果需要保留部门首次出现的顺序而非按字母排序,可使用:
awk -F ',' 'NR>1 { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2) if (!seen[$2]++) arr[++n] = $2 } END { for (i=1; i<=n; i++) printf "%s%s", arr[i], (i<n ? "/" : "\n") }' your_file.csv
步骤解析:
- 用关联数组
seen记录已出现的部门 - 数组
arr保存首次出现的部门值 - END块遍历数组并拼接输出
方法3:修改原有循环脚本
如果需要保留逐行处理的逻辑,可使用关联数组追踪已存在的部门:
declare -A seen_departments current_Department="" while IFS=, read -r Server Department; do # 跳过表头行 [[ "$Server" == "Server" ]] && continue # 去除部门值首尾空格 trimmed_dept=$(echo "$Department" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//') # 仅添加未出现过的部门 if [[ -z "${seen_departments[$trimmed_dept]}" ]]; then seen_departments[$trimmed_dept]=1 current_Department=${current_Department:+$current_Department/}$trimmed_dept fi done < your_file.csv echo "$current_Department"
原脚本问题说明
你当前的脚本没有对已添加的部门做去重判断,只是简单将每个新读取的$Department拼接到$current_Department后,导致重复值被多次添加。核心缺失的是追踪已存在值的逻辑,上述方案均通过关联数组或排序去重解决了这个问题。
内容的提问来源于stack exchange,提问作者Jami
相关产品推荐
相关产品推荐

