代码改变世界

实用指南:Bash Shell脚本学习——唇读数据集验证脚本

2025-12-10 08:13  tlnshuju  阅读(4)  评论(0)    收藏  举报

【1】脚本目的

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

具体目标

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

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


【2】脚本内容

# 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 (word count)
  • 语法: -l 参数表示统计行数( line)。
  • 输入重定向 <: 将文件内容作为命令的输入

(2)head -10 label_sorted.txt | nl

  • 命令: headnlnumber lines)

  • 语法:

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

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

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

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

  • 命令: lslist) 和 wc (word 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的含义如下表所示:
    数字名字全称作用默认指向
    0stdinstandard input标准输入键盘
    1stdoutstandard output标准输出屏幕(终端)
    2stderrstandard 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(相等吗?)
命令替换$(命令)先把命令结果算出来,再放这里