通过给定指令将项目迭代存储到相应的文件中



我想按照给定的指令对相应文件执行排序项目。

说明如下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_*,不包括下一个>(并附加到相应的file_**并将其另存为file_**_upd

将不胜感激!

附言有些文件属于同一个文件!

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} $_;
}'
打开
  • 打开一个文件,"<"表示读取,而">"表示写入
  • 菱形运算符<>从文件句柄读取,请参阅读取行。
  • 指令中的对将保存到关联表%where(另请参阅映射和拆分(。
  • contents.txt逐行读取,如果一行以>开头,则会创建一个新的输出文件。输出的文件句柄在循环外部声明,因此它在迭代中幸存下来,因此>后的所有行都打印到同一文件中。

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

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} $_;
}' 

哈希 %create 会跟踪已创建的文件,因此下次会追加而不是覆盖这些文件。定义的 or 运算符//用于输出未分配给file_unknown的文件的项目。

相关内容

最新更新