我想按照给定的指令对相应文件执行排序项目。
说明如下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
的文件的项目。