将一个文件中的不同文本行插入到一组文件中的特定行的最佳方法[关闭]

Posted

技术标签:

【中文标题】将一个文件中的不同文本行插入到一组文件中的特定行的最佳方法[关闭]【英文标题】:Best way to insert different lines of text from one file into a particular line into a group of files [closed] 【发布时间】:2021-02-20 21:29:29 【问题描述】:

这就是我所拥有的。

带有数据的文件:

5 Lorem ipsum dolor sit amet, et pri sumo facer, in duo putant atomorum. Usu moderatius
ullamcorper eu, at pri modus summo necessitatibus, pro illum urbanitas ut. Qui cu falli
gloriatur, at perpetua tincidunt nec, vis an lorem detraxit. Audiam insolens nam cu, dico suas
mel eu, pro an doctus habemus mandamus.

6 Assum tibique eloquentiam ne mei, at mel quando tamquam iudicabit. In adhuc everti vix, no
hendrerit persecuti cum. Latine lucilius id sit, an mei maiestatis instructior. Id duo sint
vidit perfecto. Affert adipisci urbanitas ne sit, cu oblique appareat efficiendi cum, mel munere
utamur ad. An eum eius dicam, mei malis vocent epicurei cu, an his appareat insolens constituto.

7 Ut eum falli reprehendunt. Te mea homero expetendis. Ullum numquam accumsan te nam, quo eu
diceret sadipscing. Eam eu erant consulatu assentior. Sed ei quem munere docendi, te accusam
delectus vel.

8 Facete vivendo qui no, reque dolore repudiare ad qui. Sit ea tation iisque delenit. Ad quod
brute usu, ei alii semper iracundia sit. Ius atqui aperiam eu, nec no minimum deleniti. Putent
dolorem vulputate eu nec, sit nihil facilis complectitur te.

9 Per brute assueverit at. Ut vim labitur debitis, nec alii nonumes oporteat no. Usu ea animal
blandit corrumpit. Ei alterum praesent vis, pro idque saepe vocent an. Usu in accusata invenire
iracundia, graeco officiis vim eu.

我有一堆文件,每个文件都有一个空行 13:

2020-10-12-lorem.md 2020-10-13-ipsum.md 2020-10-14-dolor.md 2020-10-15-sit.md 2020-10-16-amet.md

有没有办法将包含起始数字的第一段插入第一个文件的第 13 行,将第二段插入第二个文件的第 13 行,等等。

例如:

2020-10-12-lorem.md

5 Lorem ipsum dolor sit amet, et pri sumo facer, in duo putant atomorum. Usu moderatius
ullamcorper eu, at pri modus summo necessitatibus, pro illum urbanitas ut. Qui cu falli
gloriatur, at perpetua tincidunt nec, vis an lorem detraxit. Audiam insolens nam cu, dico suas
mel eu, pro an doctus habemus mandamus.

2020-10-13-ipsum.md

6 Assum tibique eloquentiam ne mei, at mel quando tamquam iudicabit. In adhuc everti vix, no
hendrerit persecuti cum. Latine lucilius id sit, an mei maiestatis instructior. Id duo sint
vidit perfecto. Affert adipisci urbanitas ne sit, cu oblique appareat efficiendi cum, mel munere
utamur ad. An eum eius dicam, mei malis vocent epicurei cu, an his appareat insolens constituto

【问题讨论】:

您的问题的答案是“是”。到目前为止,您尝试了哪些方法,又是如何失败的? 我认为你可以减少你的样例,这样更容易测试。请阅读minimal reproducible example,尤其是bash tag info 中的“如何将糟糕的脚本变成好问题”部分。祝你好运。 【参考方案1】:

试试这个:

use strict;
use warnings;

#Input file
my $filewithdata = "FileWithData.txt"; my $temp;

#Input file reading here
open(FILE, $filewithdata) || die "... $!\n";
 local $/; $_ = <FILE>; $temp = $_;  
close(FILE);


#List of Blank data files
my @Tobe_Inserted_files = qw(2020-10-12-lorem.md 2020-10-13-ipsum.md 2020-10-14-dolor.md 2020-10-15-sit.md 2020-10-16-amet.md );

#Split the data file by double entermark (As per your example)
my @datasSplited = split /\n2,/, $temp; my $i = 0;
for(@datasSplited)

    #Each splitted data into the corresponding files
    open(OUT, ">$Tobe_Inserted_files[$i]") || die "...$!\n";
    print OUT $_;
    close(OUT);
    $i++;

【讨论】:

对您的代码的一些反馈。您应该使用具有显式打开模式的 3 参数打开来避免代码注入。您应该使用词法文件句柄,即my $fh。在您的die 语句中,您不应以换行符结束它(因为它不会在错误消息中显示行号)。将文件插入变量的惯用方法是my $file = do local $/; &lt;file&gt; ; 至于解决方案,我相信我不会啜饮文件,而是逐行读取并在段落模式下使用输入记录分隔符。 $/ = ''。喜欢就去看看吧。 问题是如何在第 13 行插入一行,而不是如何用输入文件中的行覆盖现有文件。我相信一个简单的解决方案可能是使用Tie::File 是的,我接受了 3 参数来增强代码。感谢您的更新。【参考方案2】:

这可能对你有用(GNU csplit 和并行):

csplit  dataFile '/^$/1' '*' &&
parallel sed -i -e \''13r 1'\' -e \''13d'\' 2 ::: xx?? :::+ fileMD1..3 &&
rm xx??

将数据文件拆分为名为 xx00、xx01、...的单独文件

将每个 xxnn 文件与其对应的 markdown 文件配对,在第 13 行插入段落,删除现有的第 13 行。

最后,删除分割的文件。

【讨论】:

以上是关于将一个文件中的不同文本行插入到一组文件中的特定行的最佳方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 程序中的 2 个特定字符之间比较 2 个文件中的文本行

如何仅使用 URL 链接到页面中的特定文本行?

将文本行写入R中的文件

将文本行写入R中的文件

C 语言文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取文件中的文本行 | 查询文本行数据 | 追加文件数据 | 使用占位符方式拼接字符串 )

如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?