Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 什么';是否使用unix命令将特定行从一个文件复制到另一个文件?_File_Unix_Awk_Copy - Fatal编程技术网

File 什么';是否使用unix命令将特定行从一个文件复制到另一个文件?

File 什么';是否使用unix命令将特定行从一个文件复制到另一个文件?,file,unix,awk,copy,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 1. 00:00:16,520 --> 00:00:23,200 一些文本 2. 00:

我在网上搜索了几个小时,如果我忽略了什么,请原谅。我是初学者。
我想将包含特定字符串的行从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 1. 00:00:16,520 --> 00:00:23,200 一些文本 2. 00:00:25,800 --> 00:00:32,600 更多的文字 文件2的内容:

1 00: 00: 16,520 -> 00: 00: 23,200 Different text 2 00: 00: 25,720 -> 00: 00: 32,520 More different text 1. 00: 00: 16,520 -> 00: 00: 23,200 不同文本 2. 00: 00: 25,720 -> 00: 00: 32,520 更多不同的文本
awk'/-->/'文件1
列出了我需要从文件1中删除的行。但是,我必须向代码中添加什么才能获取这些awk结果并将它们仅复制到包含“/->/”的file2行中?

'/ -> /' 非常感谢您的支持

文件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. 00:00:16,520 --> 00:00:23,200 不同文本 2. 00:00:25,800 --> 00:00:32,600 更多不同的文本
注意:下面是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
这些都不是完美的,只是想让你知道如何做这件事。
根据您的情况选择,并自行改进代码:)

注意:如果要替换文件,它们只是打印到控制台。您可以使用
>
或'>>`将输出打印到临时文件,然后重命名为文件2。
例如:

awk 'ARGIND==1 && /-->/{tl[i++]=$0} ARGIND==2 {if (/->/) print tl[j++]; else print $0} ' file1 file2 >> tmpFile2check  
如果您没有使用GNU awk,
argid==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”
或其他文件检查方法以避免错误处理。

非常感谢您的输入。我尝试了你所有的建议,但到目前为止没有成功。我一直在努力,但如上所述,我只是一个初学者:)@piano_world学习一些awk的基本知识,而不是没完没了地搜索。同时检查我刚刚更新的最后一个。我学习了基础知识,并且知道输出。。。还在努力。无论如何,谢谢。@piano_world很难说你对awk有什么了解。你的问题并没有显示出你的能力,尤其是在“我只是一个初学者”的补充下。Tiw很好地帮助了你,而“无论如何,谢谢”并不足以表达你的感激之情。请考虑投票,而不是留下一个感谢的评论。“拉斐尔希望我现在做得正确。这个论坛还是新的。下次请展示更多你最初的尝试;这几乎不足以证明一个好问题是正确的。此外,问题陈述应清楚说明。请阅读。
awk 'NR==FNR && /-->/{tl[i++]=$0} NR>FNR {if (/->/) print tl[j++]; else print $0} ' file1 file2 >> tmpFile2check