Что такое команда unix для копирования определенных строк из одного файла в другой файл? - PullRequest
0 голосов
/ 30 декабря 2018

Я искал в Интернете часами, извините, если я что-то упустил.Я новичок.
Я хочу скопировать строки, содержащие определенную строку, из файла1 в файл2.Эти строки из файла 1 должны быть вставлены в файл2, но только в определенных строках, содержащих другую строку.

(это касается целых строк с временным кодом)

Содержимое файла1:

1
00:00:16,520 --> 00:00:23,200
Some text

2
00:00:25,800 --> 00:00:32,600
Some more text

Содержимое файла2:

1
00: 00: 16,520 -> 00: 00: 23,200
Different text

2
00: 00: 25,720 -> 00: 00: 32,520
More different text


awk '/ --> /' file1

перечисляет строки, которые мне нужны из файла1.Но что мне нужно добавить в код, чтобы получить эти результаты awk и скопировать их только в строки файла2, которые включают
'/ -> /'
??

Большое спасибо за вашу поддержку !!!

Результат в файле2 должен быть:

1
00:00:16,520 --> 00:00:23,200
Different text

2
00:00:25,800 --> 00:00:32,600
More different text

1 Ответ

0 голосов
/ 30 декабря 2018

Примечание : ниже это для GNU awk

Итак, вы хотите заменить временную шкалу субтитров, верно?
Учитывая, что они индексируются индексируются, т.е.числа над временным кодом совпадают.
Тогда вы можете попробовать это:

awk 'ARGIND==1 && /^[0-9]+$/{getline timeline; tl[$0]=timeline;}ARGIND==2 &&/^[0-9]+$/{getline tmp2drop; print $0 ORS tl[$0];} ' file1 file2

Обратите внимание, что /^[0-9]+$/ - это критерий, который соответствует целой строке только числом.
Ноесли у вас такой текст субтитров существует, то это приведет к ошибке замены.

Другой способ - использовать номер строки (обозначается FNR) в качестве индекса:

awk 'ARGIND==1 && /-->/{tl[FNR]=$0} ARGIND==2 {if (/->/) print tl[FNR]; else print $0} ' file1 file2

Но еслиномер строки между двумя файлами не совпадает, например, некоторые тексты субтитров являются многострочными, они все равно будут заменены неправильно.

Учитывая вхождения в относительно одинаковых местах, мы можем самостоятельно управлять индексом:

awk 'ARGIND==1 && /-->/{tl[i++]=$0} ARGIND==2 {if (/->/) print tl[j++]; else print $0} ' file1 file2

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

примечание: они просто выводятся на консоль, если вы хотите заменить файл.вы можете использовать > или '>> `, чтобы напечатать вывод во временный файл, а затем переименовать в file2.
Например:

awk 'ARGIND==1 && /-->/{tl[i++]=$0} ARGIND==2 {if (/->/) print tl[j++]; else print $0} ' file1 file2 >> tmpFile2check  

Если вы не используете GNU awk, ARGIND==1 не будет работать, затем используйте это:

awk 'NR==FNR && /-->/{tl[i++]=$0} NR>FNR {if (/->/) print tl[j++]; else print $0} ' file1 file2 >> tmpFile2check

NR означает количество записей, FNR означает количество записей текущего файла.Если они равны, то это первый файл, с которым имеет дело скрипт.Если NR>FNR означает, что это не первый файл.
Примечание , если файл1 пуст или может быть пустым, этот механизм не будет работать, тогда вам следует перейти на FILENAME=="file1" или другой метод проверки файлов, чтобы избежатьобработка ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...