我有一个包含WAV文件列表的纯文本文件:
0001.wav 0002.wav
0003.wav 0004.wav
0005.wav 0006.wav 00007.wav 0008.wav
0009.wav
0010.wav
0011.wav 0012.wav 0013.wav
0014.wav
0015.wav
这些文件与纯文本文件位于同一文件夹中。
根据How to merge several audio files using sox,我可以使用sox -m <filename> <filename> <filename>
将sox
中的所有文件合并在一起。如何使用sox
将同一行中列出的所有文件合并到一个文件中,输出文件按顺序命名,例如:
答案 0 :(得分:1)
你应该可以这样做:
#!/bin/bash
filename=$1
i=1
while IFS=" " read -r -a line
do
sox ${line[@]} m$(printf "%04d" $i).wav
let i+=1
done < $filename
在这里,我们将作为脚本的第一个参数的文件读入数组line
,其中IFS=" "
表示使用空格作为分隔符,如果使用选项卡,则应将此更改为IFS="\t"
。
${line[@]}
扩展了输入文件名数组。
m$(printf "%04d" $i).wav
表示指定格式为mXXXX.wav的文件名,其中printf
用于获取格式。
i
是您为输出文件名迭代的变量。
答案 1 :(得分:1)
我想知道是否可以在一行中完成此操作。我想我已经在这里了。
cat <file> | xargs -L 1 printf "%s\n" | xargs -I {} sox {} m%4n.wav gain 0 : newfile
cat
将读取您的文件(用您的文件名替换<file>
)并输入xargs
,这会将文件的每一行视为空格分隔的参数。
使用print
在新行上打印每个arg。
再次使用xargs
重新组合参数(每个都在新行上),使用-I
参数,这样我们就可以将参数放在sox
命令的前面并传递additonal参数(您不能同时使用-I
和-L
,否则您只需要一个xargs
)。
使用sox
增益过滤器设置为0,这样我们就可以链接伪新文件过滤器,每次使用模式m####.wav
编辑:没关系,这不太合适。它仍然将每个文件作为单独的参数发送。也许有更多命令行的人可以做得更好。无论如何,脚本方法可能更具可读性。