我在网上搜索了几个小时,如果我忽略了某些内容,请原谅。我是初学者。
我想将包含特定字符串的行从 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
列出了 file1 中我需要的行。但是我必须在代码中添加什么才能获取这些 awk 结果并将它们仅复制到包含
'/ -> /'的 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
最佳答案
注意:以下适用于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”
或其他文件检查方法以避免错误处理。
关于file - 将特定行从一个文件复制到另一个文件的 unix 命令是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53979800/