В каждую секунду Вы записываете 44 100 кадров (или безотносительно частоты дискретизации, которую Вы установили).
Просто сложите количество чтения кадров и остановку при записи 60*44100 из них:
total = 0
while total < 60 * 44100:
l, data = inp.read()
if l:
total += l
f.write(data)
time.sleep(.001)
awk 'NR == FNR {first[$0];next}; ! ($0 in first)' "$file2" "$file1" >> "$file2"
Предполагается, что имена файлов не содержат =
символов. Если они могут, на системах, которые поддерживают / dev / fd / n, вы можете сделать:
awk 'NR == FNR {first[$0];next}; ! ($0 in first)' \
/dev/fd/3 3< "$file2" /dev/fd/4 4< "$file1" >> "$file2"
Обратите внимание, что если линии возникают несколько раз в $ file1
, а не в $ file2
, Все вхождения будут добавлены к $ File2
. Если это не то, что вы хотите, то:
awk 'NR != FNR && ! ($0 in seen); {seen[$0]}' \
/dev/fd/3 3< "$file2" /dev/fd/4 4< "$file1" >> "$file2"
Если линии уникальны, и вы не против отсортированного вывода, вы также можете сделать:
LC_ALL=C sort -uo "$file2" "$file1" "$file2"
как к тому, что не так в вашем коде:
File1 = $ 1 File2 = 2 $
Все заглавные переменные являются Конвенцией, зарезервированной для среды . Переменные переменных (переменные, экспортируемые в окружающую среду, которая представляет собой общее пространство имен), поэтому хорошая практика не использовать все прописные переменные для простых переменных.
Если [! -e "$ file2"] тогда touch $ file2. фигурировать
Вы процитировали его в аргументах
[
, но не на Touch
, почему?
также обратите внимание, что это
touch "$file_or_option"
, если вы хотите, чтобы переменная всегда была обработана В качестве аргумента файлов вам нужно:
touch -- "$file2"
Также , если! условие; Тогда делайте-что-то-то, что это правда
часто плохие практики и при условии состоянии гонки. Лучше сделать Принуждение-состояние || умереть - если не мог
. Итак, здесь:
touch -- "$file2" || exit
Но в любом случае, >>
перенаправление создаст файл (и вернуть ошибку, если она не может).
во время чтения строки; делать
Когда вы начинаете использовать петли в оболочках , особенно , при прочтении
петли , то это обычно означает, что вы идете на неправильный подход. Вы собираетесь запустить несколько команд последовательно для каждой строки файла, что не так, как вы выполняете сценарию Shell. Вместо этого вы хотите запустить несколько специализированных команд один раз , сотрудничаю для задачи.
Во-первых, читать строку
в Scolls POSIX синтаксис
IFS= read -r line
не
Читать строку
Если grep -q "$ line" $ file2
Опять же, это:
grep -q "$option_or_regexp"
или:
grep -q -- "$regexp"
или:
grep -qe "$regexp"
Если вы хотите искать строки вместо сопоставления REGEXPS, вам нужна параметр -F
, и если вы хотите соответствовать Линии в целом, вам нужно -x
. Так:
grep -qxFe "$line" < "$file2"
тогда эхо еще Echo $ Line >> $ file2
Опять же, вы применяете оператор Split + Glob к содержанию линии $ PILE
(и $ file2
, если использование Bash
не в режиме SH ).
также ECHO
нельзя использовать для произвольных данных. Вам нужно:
printf '%s\n' "$line" >> "$file2"
здесь. Но это отходы для повторного открытия $ file2
для каждого прохода в цикле, где вы могли бы сделать его один раз для цельного цикла.
Fi сделано <$ file1
Опять:
done < "$file1"
При использовании Bash
.