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(相等吗?)
命令替换 $(命令) 先把命令结果算出来,再放这里
相关推荐
聪明努力的积极向上2 分钟前
【设计】分批查询数据通用方法(基于接口 + 泛型 + 定点复制)
开发语言·设计模式·c#
灰色人生qwer6 分钟前
VS Code 配置Java环境
java·开发语言
yyy(十一月限定版)7 分钟前
C语言——排序算法
c语言·开发语言·排序算法
tgethe7 分钟前
Java 链表(LinkedList)
java·开发语言·链表
myzzb16 分钟前
python调用ffmpeg.exe封装装饰类调用
python·学习·ffmpeg·开发
小鸡吃米…17 分钟前
Python - 多重继承
开发语言·python
hssfscv21 分钟前
Javeweb学习笔记——Vue+Ajax
vue.js·笔记·学习·ajax
专注于大数据技术栈21 分钟前
java学习--Math 类常用方法
java·学习
catchadmin33 分钟前
使用 PHP 和 WebSocket 构建实时聊天应用 完整指南
开发语言·websocket·php
long3161 小时前
类与对象 | 低级别设计 (LLD)
java·spring boot·学习·程序人生·spring·设计模式·学习方法