bash - 通过给定指令将项目迭代存储到相应的文件
问题描述
我想通过给定的指令对相应的文件进行排序。
指令在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有些文件属于同一个文件!
解决方案
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
(另请参见map和split)。 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
。
推荐阅读
- laravel - 将 [type] 添加到可填充属性以允许在将类名插入表时出现质量分配错误
- java - SQL 服务器突然挂起 - 所有数据库连接都处于活动状态但没有响应 - SQL Server 2016
- reactjs - 你可以从 Next.js 中的 getStaticPaths() 传递非字符串对象吗?
- java - 使用地图时的编码字符串
- python-3.x - 如何获取存储库中的所有提交以及相应的分支名称?
- c# - 如何从您单击的链接按钮中获取字符串?
- proxy - 企业代理背后的开发空间
- kubernetes - Kubernetes中的VPA和HPA(Auto Scaling)可以一起使用吗?
- matlab - 如何错过 pcolor 图中的矩阵元素?
- algorithm - 在两个单元格之间找到网格空间的算法