文章目录
- 【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)
- [(1)`wc -l < label_sorted.txt`](#(1)
- 【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
-
命令 :
head和nl(n umber lines) -
语法:
head -10: 显示文件的前10行。|: Pipe (管道),将第一个命令的标准输出 ,作为第二个命令的标准输入。nl: 为输入内容添加行号。
(3)ls -1 $DATA_PATH | wc -l
- 命令 :
ls(l 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)
-
命令: 命令替换与变量赋值。
-
语法:
$(...): 命令替换。先执行...内的命令,然后将其标准输出的结果作为字符串替换到此处。变量=$(...): 将命令替换得到的结果赋值给变量。
-
解释:
- 执行
find命令 :在$DATA_PATH/$label/train目录下查找所有以.pkl结尾的文件。 - 处理错误
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 |
"如果...就...否则..." 【fi是if倒写,表示结束】 |
| 循环 | while read...do...done |
"当还能读read到数据,就继续干" |
| 条件测试 | [ -z "$var" ] [ $a -eq $b ] |
-z=zero(空吗?) -eq=equal(相等吗?) |
| 命令替换 | $(命令) |
先把命令结果算出来,再放这里 |