You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:36:07