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

标签 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

最佳答案

注意:以下适用于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/

相关文章:

linux - 通过命令使用 ssh 和 pbrun 时出错

regex - 为什么空格分隔而不是 FPAT

linux - 在多个文件中的现有字符串周围添加引号

python - (初学者)使用 Python 重命名文件 - 重构以获得更好的答案

java - 从文本文件中读取,然后将值赋给数组

C 将文件指针传递给函数

c++ - 监控表中的数据

linux - awk 循环处理不同的文件

sed 或 awk : how to call line addresses from separate file?

android - 如何重命名 Android 根目录中的文件?