我在网上搜索了几个小时,如果我忽略了某些内容,请原谅。我是一个初学者。
我想将包含某个字符串的行从file1复制到file2。文件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
'/ -> /'的file2行中?
file2中的结果应为:
1 00:00:16,520 --> 00:00:23,200 Different text 2 00:00:25,800 --> 00:00:32,600 More different text
答案 0 :(得分:1)
注意:以下是 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
但是,如果两个文件之间的行号不同,例如某些字幕文本是多行的,它仍将替换wronly。
鉴于事件发生在相对相同的位置,我们可以自行管理索引:
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
表示它不是第一个文件。
注意,如果file1为空或可能为空,则此机制将失败,因此您应更改为FILENAME=="file1"
或其他文件检查方法,以避免错误处理。