如何合并出现在列表中同一行的所有WAV文件?

时间:2013-11-15 03:36:37

标签: bash audio sox

我有一个包含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将同一行中列出的所有文件合并到一个文件中,输出文件按顺序命名,例如:

  • 0001.wav 0002.wav→m0001.wav
  • 0003.wav 0004.wav→m0002.wav
  • 0005.wav 0006.wav 00007.wav 0008.wav→m0003.wav

2 个答案:

答案 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

创建一个新文件

编辑:没关系,这不太合适。它仍然将每个文件作为单独的参数发送。也许有更多命令行的人可以做得更好。无论如何,脚本方法可能更具可读性。