示例
exec 3<pre_data/wav.scp
exec 4<pre_data/text
exec 5<pre_data/text
while read wav <&3 && read txt <&4 && read txt1 <&5
do
key=`echo $wav | awk -F ' ' '{ printf $1}'`
wav=`echo $wav | awk -F ' ' '{ printf $2}'`
txt=`echo $txt | awk -F ' ' '{ printf $2}'`
echo "{\"key\":\"${key}\",\"wav\":\"${wav}\",\"txt\":\"${txt}\" }" >> pre_data/data.list
done
代码解读
前面的数字是文件描述符,从3开始,因为0,1,2被系统shell默认使用了
小于号<的意思是把文件读取到文件描述符中,可以理解为一个暂时存放数据的一个容器
这里创建了三个这样的容器,名字分别是 3 4 5
exec 3<pre_data/wav.scp
exec 4<pre_data/text
exec 5<pre_data/text
这里用到了一个按行读取文件的技巧,通过while循环读取文件的内容,文件可以是容器里面的数据也可以是cat输出里面的数据,总之是有一个数据来源可供读取
方式1
while read line 文件名
do
echo $line
done
方式2
while read line
do
echo $line
done < 文件名
方式3
cat 文件名 | while read line
do
echo $line
done
方式4
while read line < 文件名
do
echo $line
done
这里就是通过上面的技巧再加上一个小小的技巧,即通过&& / 与
操作符进行连接,完成多文件操作,同时操作多个文件对应的每一行
这里需要注意的是:只能使用文件描述符的方式给它数据,否则会出现只读取第一行数据的死循环
while read wav <&3 && read txt <&4 && read txt1 <&5
do
key=`echo $wav | awk -F ' ' '{ printf $1}'`
wav=`echo $wav | awk -F ' ' '{ printf $2}'`
txt=`echo $txt | awk -F ' ' '{ printf $2}'`
done