将特定行从一个文件复制到另一个文件的unix命令是什么?

时间:2018-12-30 17:22:43

标签: file unix awk copy

我在网上搜索了几个小时,如果我忽略了某些内容,请原谅。我是一个初学者。
我想将包含某个字符串的行从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

1 个答案:

答案 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"或其他文件检查方法,以避免错误处理。