如何在UNIX中分解这样的文件?

如何在UNIX中分解这样的文件?,unix,file-manipulation,Unix,File Manipulation,我有一个主文件,其中包含3696个文件的内容。每个文件都有一个重复的结构:它从一行开始,行中包含引用自的文件名,并以结束。文件中没有其他重复。有没有办法把主文件分解成更小的文件? 例如,如果主文件包含以下两个文件 "features/mmjr0_si2166.rec" 0 1800000 L104 -755.825928 1800000 2600000 L25 -397.663269 2600000 3600000 L6 -419.864960 3600000 3800000 L98 -

我有一个主文件,其中包含3696个文件的内容。每个文件都有一个重复的结构:它从一行开始,行中包含引用自的文件名,并以
结束。文件中没有其他重复。有没有办法把主文件分解成更小的文件? 例如,如果主文件包含以下两个文件

    "features/mmjr0_si2166.rec"
0 1800000 L104 -755.825928
1800000 2600000 L25 -397.663269
2600000 3600000 L6 -419.864960
3600000 3800000 L98 -116.326584
3800000 4500000 L104 -315.009827
4500000 5500000 L93 -447.467133
5500000 6300000 L12 -352.010101
6300000 7600000 L45 -556.794006
7600000 7900000 L8 -175.087677
.
"features/mesd0_si1002.rec"
0 1300000 L104 -530.985107
1300000 1700000 L13 -207.014145
1700000 2300000 L47 -303.084534
2300000 2900000 L104 -300.312927
2900000 3200000 L96 -151.823212
3200000 3700000 L46 -235.867447
3700000 4000000 L49 -170.302170
4000000 5200000 L97 -517.739868
5200000 6200000 L28 -453.094452
.

我希望将它们分开,并将它们存储在目录“features”中,第一个文件名为mmjr0_si2166.rec,第二个文件名为mesd0_si1002.rec,可能有更紧凑的方法用Perl编写,但这具有第一次使用的优点:

#!/usr/bin/env perl
use strict;
use warnings;

my $fh = undef;

while (<>)
{
        if (/^\s*"([^"]+)"\s*$/)
        {
                my $new_file = $1;
                close $fh if (defined $fh);
                open $fh, ">", $new_file or die "Failed to open $new_file";
        }
        elsif (/^\s*\.\s*$/)
        {
                # Ignore lines with a dot only
                next;
        }
        else
        {
                print $fh $_;
        }
}
#/usr/bin/env perl
严格使用;
使用警告;
my$fh=未定义;
而()
{
如果(/^\s*”([^“]+)“\s*$/)
{
我的$new_文件=$1;
如果(定义为$fh),则关闭$fh;
打开$fh、“>”、$new_文件或die“无法打开$new_文件”;
}
elsif(/^\s*\.\s*$/)
{
#仅忽略带点的线
下一个
}
其他的
{
打印$fh$;
}
}
它会从生成的文件中省略文件名和点标记。包含它们所需的更改很简单。如果遇到“点线”而不是文件名线,它不会反对。它假定目录对于已经存在的文件。如果这是一个问题,您可以在打开文件之前使用模块创建目录。它允许在文件名的引号前后使用空格;还允许在仅包含一个点的行之前和之后使用空格。如果不合适,您可以调整正则表达式。

awk示例

#!/bin/bash
if [ ! -d features ] 
then
       mkdir features
fi
tr -d '"' < bigfile |
  awk '/features/ { close(file); file=$1; next}
            {print $0 >file} ' 
!/bin/bash
如果[!-d功能]
然后
mkdir特性
fi
tr-d'文件}'

你有没有研究过
拆分
grep
?不幸的是,我不知道他们都没有!你熟悉哪些工具?我会使用perl,我熟悉UNIX命令,还有一些perl和Sed,在这种情况下,您如何使用perl?