An efficient way to transpose a file in Bash

前端 未结 29 2675
时光说笑
时光说笑 2020-11-22 03:30

I have a huge tab-separated file formatted like this

X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11

I would like t

29条回答
  •  深忆病人
    2020-11-22 03:37

    A hackish perl solution can be like this. It's nice because it doesn't load all the file in memory, prints intermediate temp files, and then uses the all-wonderful paste

    #!/usr/bin/perl
    use warnings;
    use strict;
    
    my $counter;
    open INPUT, "<$ARGV[0]" or die ("Unable to open input file!");
    while (my $line = ) {
        chomp $line;
        my @array = split ("\t",$line);
        open OUTPUT, ">temp$." or die ("unable to open output file!");
        print OUTPUT join ("\n",@array);
        close OUTPUT;
        $counter=$.;
    }
    close INPUT;
    
    # paste files together
    my $execute = "paste ";
    foreach (1..$counter) {
        $execute.="temp$counter ";
    }
    $execute.="> $ARGV[1]";
    system $execute;
    

提交回复
热议问题