Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Linux:将文件列拆分为多个文件_Python_Linux_Perl - Fatal编程技术网

Python Linux:将文件列拆分为多个文件

Python Linux:将文件列拆分为多个文件,python,linux,perl,Python,Linux,Perl,将一个包含许多列(约600000列)的大文件拆分为6个文件并在6个文件中均匀分布列的最佳(最简单的)方法是什么?另外,我希望每个文件都有原始文件的前6列 例如: FID IID MID PID SEX PHENO SNP1 SNP2 SNP3 SNP4 1 70323 0 0 2 2 0 0 1 0 ... 2

将一个包含许多列(约600000列)的大文件拆分为6个文件并在6个文件中均匀分布列的最佳(最简单的)方法是什么?另外,我希望每个文件都有原始文件的前6列

例如:

 FID     IID     MID     PID     SEX     PHENO   SNP1    SNP2    SNP3    SNP4
 1       70323   0       0       2       2       0       0       1       0    ...
 2       70323   0       0       2       2       1       0       2       1    ...
 3       70323   0       0       2       2       0       0       0       1    ...
 ...
最好使用ubuntu提供的基本linux命令行函数(或perl/python脚本)解决方案

我的PERL解决方案: 下面是我在Perl中所做的。它非常丑陋,所以我希望有一个简单优雅的解决方案

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

my $line;
my $num_snps=0;
my $i=0;

my $OUT1;
my $OUT2;
my $OUT3;
my $OUT4;

my $end1;
my $end2;
my $end3;
my $end4;
while($line = <>){
        chomp $line;
        my @a = split(/\s/,$line);
        if($i==0){
                $num_snps = $#a + 1 - 6;

                $end1 = 5+int($num_snps/4);
                $end2 = $end1+int($num_snps/4)+1;
                $end3 = $end2+int($num_snps/4)+1;
                $end4 = $#a;

                print("Breaks: $end1\t$end2\t$end3\t$end4\tTotal SNPs: $num_snps\n");
        }else{
                open($OUT1 , ">>kuehn1.raw");
                print $OUT1 join(" ",@a[0..5])." ".join(" ", @a[6..$end1])."\n";
                close($OUT1);
                open($OUT2 , ">>kuehn2.raw");
                print $OUT2 join(" ",@a[0..5])." ".join(" ", @a[($end1+1)..$end2])."\n";
                close($OUT2);
                open($OUT3 , ">>kuehn3.raw");
                print$OUT3 join(" ",@a[0..5])." ".join(" ", @a[($end2+1)..$end3])."\n";
                close($OUT3);
                open($OUT4 , ">>kuehn4.raw");
                print$OUT4 join(" ",@a[0..5])." ".join(" ", @a[($end3+1)..$end4])."\n";
                close($OUT4);
        }
        $i=$i+1;
}
#/usr/bin/perl
使用警告;
严格使用;
我的美元线;
我的$num\u snps=0;
我的$i=0;
我的1美元;
我的2美元;
我的3美元;
我的4美元;
我的$end1;
我的$end2;
我的$end3;
我的$end4;
而($line=){
chomp$行;
my@a=拆分(/\s/,$line);
如果($i==0){
$num_snps=$#a+1-6;
$end1=5+int($num\u snps/4);
$end2=$end1+int($num_snps/4)+1;
$end3=$end2+int($num_snps/4)+1;
$end4=$#a;
打印(“中断:$end1\t$end2\t$end3\t$end4\t总SNPs:$num_SNPs\n”);
}否则{
开放式($OUT1,“>>kuehn1.raw”);
打印$OUT1 join(“,@a[0..5])。”。join(“,@a[6..$end1])。“\n”;
收盘价(1美元);
开放式($OUT2,“>>kuehn2.raw”);
打印$OUT2 join(“,@a[0..5])。“”。join(“,@a[($end1+1)…$end2])。“\n”;
收盘价(2美元);
开放式($OUT3,“>>kuehn3.raw”);
打印$OUT3 join(“,@a[0..5])。”join(“,@a[($end2+1)…$end3])。“\n”;
收盘价(3美元);
开放式($OUT4,“>>kuehn4.raw”);
打印$OUT4 join(“,@a[0..5])。”join(“,@a[($end3+1)…$end4])。“\n”;
收盘价(4美元);
}
$i=$i+1;
}

您可以首先使用

awk '{ print NF}' < file
awk'{print NF}'
然后利用这些知识构造断点。所以如果你的文件有66列

cut -f1-6,7-16 < file > file1
cut -f1-6,17-26 < file > file2
cut -f1-6,27-36 < file > file3
cut -f1-6,37-46 < file > file4
cut -f1-6,47-56 < file > file5
cut -f1-6,57-66 < file > file6
cut-f1-6,7-16file1
剪切-f1-6,17-26<文件>文件2
剪切-f1-6,27-36<文件>文件3
剪切-f1-6,37-46<文件>文件4
剪切-f1-6,47-56<文件>文件5
剪切-f1-6,57-66<文件>文件6

不是最优雅的,但如果你投了反对票,应该会起作用。

你能解释一下为什么我可以改进我的问题吗?你只是要求一个现成的解决方案,而没有显示出你自己解决问题的研究努力/尝试。请看,您是否可以选择将分隔符(比如说)更改为管道“|”?您所说的“均匀分布”到底是什么意思,以及您到底为什么要这样做?@LukasGraf对缺乏细节表示抱歉。我只熟悉如何使用LinuxCut从文件中剪切列,但不确定如何获取文件中有多少列