2015-04-30 2 views
1

У меня есть небольшая проблема с получением звуковых времен из простого текстового файла и резки и аудиофайла с помощью SoX.Получите время и вырежьте с помощью SOX

У меня есть список времени, как:

0 
4.053 
8.879 
15.651 
19.684 
21.853 

И мне нужно сделать аудио раздел с Sox, следующим образом:

sox NAME.wav NEW_NAME.wav trim "$time" "$duration" 

Для этого мне нужно Начальное время и продолжительность. Для Продолжительность переменной я прыгаю на одну строку из лекции и получить следующее значение AMB сделать вычитание:

cat FILE.txt | while read line; 
do 
end_time=`grep -A 1 $line FILE.txt | sed 1d` 
start_time=$line 
if [ -z "$end_time" ]; 
then 
    end_time='21.853' 
fi 
#echo "This is start: $start_time" 
#echo "This is end: $end_time" 

duration=$(echo "$end_time-$start_time" | bc) 
#echo "DURATION: $duration" 
done 

Но я получаю некоторые ошибки в переменной Продолжительность, может кто-нибудь помочь мне с этим сценарием?

Спасибо большое

+0

Попробуйте с 'Ьс - L'. – Wintermute

ответ

1

Не уверен, что, если она соответствует вашим потребностям, но это выглядит более логичным, чтобы сделать это таким образом:

FILE.TXT

0  4.053 
8.879 15.651 
19.684 21.853 

yourscript.sh

cat FILE.txt | while read start_time end_time; 
do 
    if [ -z "$end_time" ]; 
    then 
     end_time='21.853' 
    fi 
    #echo "This is start: $start_time" 
    #echo "This is end: $end_time" 

    duration=$(echo "$end_time-$start_time" | bc) 
    echo "DURATION: $duration" 
done 

Выход

DURATION: 4.053                                       
DURATION: 6.772                                       
DURATION: 2.169 
+0

Разница заключается в файле FILE.txt. У меня есть один столбец, но спасибо dekkard – Sergi

+0

Да, это идея - вы добавляете связанные значения в одну строку. По крайней мере, это более очевидно и в некотором роде предотвращает забывание о том, что должно быть четное количество значений. – dekkard

+1

Даже если вы пройдете мимо UUOC, каждый раз, когда вы пишете цикл в оболочке, просто для управления текстом у вас неправильный подход. Все вышеперечисленное может быть заменено на 'awk '{print" DURATION: ", $ 2- $ 1}' file'. –

3
awk '{ if ($1 != 0)printf "sox NAME.wav NEW_NAME.wav trim \"%s\" \"%s\"\n", LastTime, $1 - LastTime;LastTime = $1;}' YourFile 

не легче AWK? или партия является обязательным (адаптировать вывод с содержанием PRINTF и любой другой информации)

sox NAME.wav NEW_NAME.wav trim "0" "4.053" 
sox NAME.wav NEW_NAME.wav trim "4.053" "4.826" 
sox NAME.wav NEW_NAME.wav trim "8.879" "6.772" 
sox NAME.wav NEW_NAME.wav trim "15.651" "4.033" 
sox NAME.wav NEW_NAME.wav trim "19.684" "2.169" 
0

Просто используйте AWK, такого рода задачи является то, что он предназначен, чтобы сделать:

$ awk '!(NR%2){print "sox NAME.wav NEW_NAME.wav trim", p, $0-p} {p=$0}' file 
sox NAME.wav NEW_NAME.wav trim 0 4.053 
sox NAME.wav NEW_NAME.wav trim 8.879 6.772 
sox NAME.wav NEW_NAME.wav trim 19.684 2.169 
Смежные вопросы