Добавьте недостающее содержание одного файла другому

В каждую секунду Вы записываете 44 100 кадров (или безотносительно частоты дискретизации, которую Вы установили).

Просто сложите количество чтения кадров и остановку при записи 60*44100 из них:

total = 0
while total < 60 * 44100:
    l, data = inp.read()
    if l:
        total += l
        f.write(data)
        time.sleep(.001)
3
27.08.2017, 03:54
1 ответ
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 .

4
27.01.2020, 21:19

Теги

Похожие вопросы