C Shell脚本中如何从两个目录列表中剔除重复公共目录
C Shell 提取sta_views独有的目录实现方法
首先修正你原有代码的两个基础错误:
- 变量名拼写错误:你定义的变量是
sta_views、pnr_views,示例代码中误写为sta_view、pnr_view,少了末尾的s - C Shell的
if判断中,方括号[和]两侧必须预留空格,否则会报语法错误
通用兼容实现方案(支持所有C Shell环境)
不需要依赖额外特性,直接通过字符串匹配判断元素是否存在,适合绝大多数场景:
# 初始化存储sta独有目录的列表 set sta_unique = () # 遍历sta_views的所有目录名 foreach view ($sta_views) # 静默判断当前目录名是否在pnr_views列表中,-x要求整行完全匹配 echo "$pnr_views" | xargs -n1 | grep -xq "$view" # $status为上一条命令返回值,非0代表未匹配到(即当前目录是sta独有) if ($status != 0) then set sta_unique = ($sta_unique $view) endif end # 打印最终结果校验 echo "sta_views独有的目录列表:$sta_unique"
高性能实现方案(适用于tcsh环境,列表量大时更快)
如果你的运行环境是tcsh,可以用关联数组降低匹配的时间复杂度:
# 初始化关联数组存储pnr所有目录名作为key set -A pnr_map foreach pnr_view ($pnr_views) set pnr_map[$pnr_view] = 1 end set sta_unique = () foreach view ($sta_views) # 直接判断key是否存在,无需每次遍历整个pnr列表 if (! $?pnr_map[$view]) then set sta_unique = ($sta_unique $view) endif end
额外优化建议
你原有获取目录列表的写法可以简化,避免ls解析文件名时可能出现的空格、特殊字符问题:
# 等价于原pnr_views获取逻辑,自动提取目录的尾名 set pnr_views = (pnr/rep/signoff_pnr/*/:t) # 等价于原sta_views获取逻辑,排除指定目录 set sta_views = (sta/rep/*/:t) set sta_views = `echo "$sta_views" | xargs -n1 | grep -v common | grep -v signoff.all.SAVEDESIGN`
内容的提问来源于stack exchange,提问作者Coding Enthusiast
相关产品推荐
相关产品推荐

