Bash Shell脚本学习——唇读数据集验证脚本

文章目录

  • 【1】脚本目的
  • 【2】脚本内容
  • 【3】逐句语法分析
    • [(1)`wc -l < label_sorted.txt`](#(1)wc -l < label_sorted.txt)
    • [(2)`head -10 label_sorted.txt | nl`](#(2)head -10 label_sorted.txt | nl)
    • [(3)`ls -1 DATA_PATH \| wc -l\`](#(3)`ls -1 DATA_PATH | wc -l`)
    • [(4) `ls -1 DATA_PATH \| head -10\`](#(4) `ls -1 DATA_PATH | head -10`)
    • [(5)`head -20 label_sorted.txt | while read label; do ... done`](#(5)head -20 label_sorted.txt | while read label; do ... done)
    • [(6)`[ -z "label" \] \&\& continue\`](#(6)`[ -z "label" ] && continue`)
    • [(7)`TRAIN=(find ... \| wc -l)\`](#(7)`TRAIN=(find ... | wc -l)`)
    • [(8)`if [ "TRAIN" -eq 0 \] \|\| \[ "VAL" -eq 0 ]; then ... else ... fi`](#(8)if [ "$TRAIN" -eq 0 ] || [ "$VAL" -eq 0 ]; then ... else ... fi)
  • 【4】脚本中的知识点总结

【1】脚本目的

核心功能 :系统化验证500类唇读数据集的完整性与可用性

具体目标

  • 确认500个单词标签一个不少
  • 检查数据是不是都按"单词名/train/、单词名/val/"的方式排列
  • 统计每个单词到底有多少训练样本、多少验证样本
  • 快速找到哪些单词数据缺失或有问题,避免训练时掉链子
  • 确保所有数据质量过关,放心交给模型去学习

应用场景 :深度学习项目数据准备阶段的质量控制


【2】脚本内容

bash 复制代码
# 1. 环境设置
cd ~/lip_reading_project/learn-an-effective-lip-reading-model-without-pains
DATA_PATH=/home/liyana/lrw_roi_80_116_175_211_npy_gray_pkl_jpeg

# 2. 标签文件分析
echo "标签文件统计:"
wc -l < label_sorted.txt  # 标签数量
head -10 label_sorted.txt | nl  # 前10个标签

# 3. 数据目录检查
echo "数据目录统计:"
ls -1 $DATA_PATH | wc -l  # 目录数量
ls -1 $DATA_PATH | head -10  # 前10个目录

# 4. 样本数量验证
echo "前20个标签的数据情况:"
head -20 label_sorted.txt | while read label; do
    [ -z "$label" ] && continue
    TRAIN=$(find $DATA_PATH/$label/train -name "*.pkl" 2>/dev/null | wc -l)
    VAL=$(find $DATA_PATH/$label/val -name "*.pkl" 2>/dev/null | wc -l)
    if [ "$TRAIN" -eq 0 ] || [ "$VAL" -eq 0 ]; then
        echo "  ❌ $label: train=$TRAIN, val=$VAL"
    else
        echo "  ✅ $label: train=$TRAIN, val=$VAL"
    fi
done

【3】逐句语法分析

(1)wc -l < label_sorted.txt

  • 命令 : wc (w ord count)
  • 语法 : -l 参数表示统计行数( line)。
  • 输入重定向 <: 将文件内容作为命令的输入

(2)head -10 label_sorted.txt | nl

  • 命令 : headnln umber lines)

  • 语法:

    head -10: 显示文件的前10行。

    |: Pipe (管道),将第一个命令的标准输出 ,作为第二个命令的标准输入

    nl: 为输入内容添加行号。

(3)ls -1 $DATA_PATH | wc -l

  • 命令 : lsl is t) 和 wc (w ord count)
  • 语法 :
    • ls -1: 将目录中的文件和子目录以每行1个的形式列出。
    • wc -l: 统计行数,从而得到目录总数。
    • 变量引用 $DATA_PATH : 当Shell看到 ls -1 $DATA_PATH 时,它会先进行**"变量替换"**,把 $DATA_PATH 替换成其值 /home/liyana/...,然后再执行命令,等同于直接写了 ls -1 /home/liyana/...

(4) ls -1 $DATA_PATH | head -10

  • 语法: 组合使用,只列出前10个目录。

(5)head -20 label_sorted.txt | while read label; do ... done

  • 命令 : while 循环。

  • 语法:

    head -20 label_sorted.txt |

    • 首先,head 命令取出 label_sorted.txt 文件的前20行。

    while read label;

    • while 关键字: 开始一个循环。循环的条件是...
    • read label 命令: 从标准输入 中读取一行内容,并将其赋值给变量 label

    组合起来理解while read label 的意思是:"只要 read label 这个命令还能成功地从输入中读取到一行数据,循环就继续执行。" 当输入耗尽(前20行读完了),read 命令就会失败,循环也就结束了。

(6)[ -z "$label" ] && continue

  • 命令: 条件判断与流程控制。
  • 语法 :
    • [ -z "$变量" ]: 判断一个变量是否为空字符串(zero length))。
    • &&: 逻辑"与",只有当前面的命令执行成功(条件为真),才执行后面的命令。
    • continue: 跳过本次循环的剩余部分,直接开始下一次循环。

(7)TRAIN=$(find ... | wc -l)

  • 命令: 命令替换与变量赋值。

  • 语法:

    • $(...): 命令替换。先执行 ... 内的命令,然后将其标准输出的结果作为字符串替换到此处。
    • 变量=$(...): 将命令替换得到的结果赋值给变量。
  • 解释:

    1. 执行 find 命令 :在 $DATA_PATH/$label/train 目录下查找所有以 .pkl 结尾的文件。
    2. 处理错误 2>/dev/null :将 find 命令的标准错误流重定向到"黑洞",防止因"目录不存在"等错误中断脚本或污染输出。2的含义如下表所示:
    数字 名字 全称 作用 默认指向
    0 stdin standard input 标准输入 键盘
    1 stdout standard output 标准输出 屏幕(终端)
    2 stderr standard error 标准错误 屏幕(终端)

(8)if [ "$TRAIN" -eq 0 ] || [ "$VAL" -eq 0 ]; then ... else ... fi

  • 命令 : if 条件判断。
  • 语法 :
    • [ A -eq B ]: 判断 A 是否等于 B。
    • ||: 逻辑"或",任意一个条件为真,则整个条件为真。
    • 如果训练集或验证集样本数为0,就打印 ❌,否则打印 ✅。
    • fi = 段落结束,画上句号

【4】脚本中的知识点总结

类别 语法要素 记忆技巧
基础命令 cd, echo, ls, head, wc, find 记英文原意: cd=换目录 echo=回声(打印) ls=列表 wc=字数统计
变量操作 变量=值 $变量 给数据(值)贴标签(变量名),用时喊名字($变量名)
重定向 > 输出 < 输入 2> 错误 箭头指方向,数字分类型(1,2,3)【 >结果存文件 < :文件当输入 2> :错误单独管 】
条件判断 if...then...else...fi "如果...就...否则..." 【fiif倒写,表示结束】
循环 while read...do...done "当还能读read到数据,就继续干"
条件测试 [ -z "$var" ] [ $a -eq $b ] -z=zero(空吗?) -eq=equal(相等吗?)
命令替换 $(命令) 先把命令结果算出来,再放这里
相关推荐
lkbhua莱克瓦242 小时前
Java基础——集合进阶5
java·开发语言·集合·泛型
聪明努力的积极向上3 小时前
【C#】System.Text.Encoding.Default 属性在framework和.netcore中的区别
开发语言·c#·.netcore
夕泠爱吃糖3 小时前
template关键字
开发语言·c++·template
ceclar1233 小时前
C++文件操作
开发语言·c++
高一要励志成为佬4 小时前
【C++】vector的迭代器失效问题,(什么是迭代器失效,为什么会产生迭代器失效,怎么避免迭代器失效问题)
开发语言·c++
xwz小王子4 小时前
PerAct2:机器人双臂操作任务的基准测试和学习
学习·机器人
CaracalTiger4 小时前
本地部署 Stable Diffusion3.5!cpolar让远程访问很简单!
java·linux·运维·开发语言·python·微信·stable diffusion
whm27774 小时前
Visual Basic 创建状态栏
开发语言·visual studio
d111111111d4 小时前
STM32外设学习--DMA直接存储器读取--学习笔记。
笔记·stm32·单片机·嵌入式硬件·学习