首页 > 解决方案 > 通过给定指令将项目迭代存储到相应的文件

问题描述

我想通过给定的指令对相应的文件进行排序。

指令在instruction.txt

item_1    file_5
item_3    file_2
item_6    file_7
item_22   file_2
...
item_m    file_n

项目存储在contents.txt

>item_1
blablas
bla
>item_2
blas
...
>item_m
bla
bla
bla

我希望该程序阅读每个项目的说明,转到内容文件并提取一个项目及其内容(包括>item_*,不包括 next >)并附加到相应的file_**并将其另存为file_**_upd.

将不胜感激!

PS有些文件属于同一个文件!

标签: bash

解决方案


Perl 来救援!

perl -we '
    open my $instruction, "<", "instruction.txt" or die $!;
    my %where = map split, <$instruction>;
    open my $contents, "<", "contents.txt" or die $!;
    my $out;
    while (<$contents>) {
        open $out, ">", $where{$1} if /^>(.*)/;
        print {$out} $_;
    }'
  • open打开一个文件,“<”表示,“>”表示
  • 菱形运算符<>从文件句柄中读取,请参阅readline
  • 指令中的对被保存到关联表中%where(另请参见mapsplit)。
  • contents.txt逐行读取,如果一行以 开头,则创建一个新的>输出文件。输出的文件句柄是在循环外声明的,所以它在它的迭代中仍然存在,所以 a 之后的所有行都>被打印到同一个文件中。

更新:要处理每个文件的多个项目,以及输出没有分配文件的项目,您需要做更多的工作:

perl -we '
    open my $instruction, "<", "instruction.txt" or die $!;
    my %where = map split, <$instruction>;
    open my $contents, "<", "contents.txt" or die $!;
    my $out;
    my $unknown = "file_unknown";
    my %created;
    while (<$contents>) {
        open $out, $created{ $where{$1} // $unknown }++ ? ">>" : ">",
             $where{$1} // $unknown if /^>(.*)/;
        print {$out} $_;
    }' 

哈希 %created 跟踪已创建的文件,因此它们会被追加而不是下次覆盖。defined-or 运算符//用于输出未分配文件的项目file_unknown


推荐阅读