C Shell脚本中如何从sta_views列表移除pnr_views包含的重复目录
C Shell 提取sta_views独有目录列表实现方案
以下是两种可直接使用的实现方式:
方式1:遍历判断(逻辑清晰,适合小数据量)
# 初始化空列表存储sta独有的目录 set sta_unique_views = () # 遍历sta_views每一个元素 foreach view ($sta_views) # 精确匹配判断元素是否存在于pnr_views中,避免子串误判 echo "$pnr_views" | tr ' ' '\n' | grep -qxF "$view" # csh中$status为上一条命令退出码,非0表示未匹配到(元素不存在于pnr_views) if ($status != 0) then set sta_unique_views = ($sta_unique_views $view) endif end
参数说明:
tr ' ' '\n':将空格分隔的列表转换为每行一个元素的格式grep -qxF:-q静默输出不打印结果,-x整行精确匹配,-F将匹配内容作为固定字符串不解析正则规则
方式2:comm命令求差集(高效简洁,适合大数据量)
直接用文本处理命令一次性计算差集,无需手动遍历:
set sta_unique_views = `comm -23 <(echo "$sta_views" | tr ' ' '\n' | sort) <(echo "$pnr_views" | tr ' ' '\n' | sort)`
逻辑说明:
comm命令默认输出三列:仅在第一个文件存在的行、仅在第二个文件存在的行、两个文件共有的行,-23参数代表关闭第二、第三列输出,最终只输出仅在sta_views中存在的元素。
优化建议
你原有的目录提取逻辑依赖ls输出拆分,遇到文件名包含空格、特殊字符时会出错,建议替换为更稳定的find写法:
# 提取pnr目录下的一级子目录名 set pnr_views = `find pnr/rep/signoff_pnr/ -maxdepth 1 -type d -printf "%f\n" | grep -v "^\.$"` # 提取sta目录下的一级子目录名,排除不需要的目录 set sta_views = `find sta/rep/ -maxdepth 1 -type d -printf "%f\n" | grep -v "^\.$" | grep -v common | grep -v signoff.all.SAVEDESIGN`
内容的提问来源于stack exchange,提问作者Coding Enthusiast
相关产品推荐
相关产品推荐

