Транспонируйте несколько столбцов (переменных длин) в строки

Следующее, кажется, работает на меня

 grep --color -E -- "$(ls -rtl | tail -n3)|$" <(ls -l)

Это использует grep с выделением на входе ls -l и использует регулярное выражение для поиска любых из исходных данных для трех самых старых команд. Это также ищет конец строки $ для печати целого файла.

Можно также поместить его в функцию, такую, что можно использовать lll * с несколькими аргументами, так же, как Вы использовали бы ls

function lll ()
{
    command grep --color -E -- "$(ls -rtl $@ | tail -n3)|$" <(ls -l $@)
}
2
21.11.2013, 01:00
1 ответ

Я использовал бы режим абзаца Perl для этого:

#!/usr/bin/env perl

use strict;
use warnings;

my %final_lines;        # Data structure to hold the modified lines
my $filename = shift // die "No input file given!\n";
open my $IN,'<',$filename or die "Failed to open $filename for input: $!\n";

PARAGRAPH: {
    local $/="";        # Paragraph mode
    while(<$IN>){       # Read a new "paragraph"
        my @lines  = split /\n/;
        my @fields = split /\s+/,(shift @lines);
        my $line_number =0;
        for my $line (@lines){
            my @data = split /\s+/,$line;
            map { 
                  $final_lines{$fields[$_]}->[$line_number] += $data[$_]
            } (0..$#data);
            $line_number++;
        }
    }
}

for my $key (sort { $a <=> $b } keys %final_lines){
    local $,=' ';
    print STDOUT $key,@{$final_lines{$key}};
    print STDOUT "\n";
}

Используйте его как так:

$ /path/to/script input_file > output_file

Этот код тестируется и должен хорошо работать. Как указано @cjm в комментариях, хотя, это, вероятно, займет время, если Ваш входной файл будет большим. Шаг, скорее всего, для занимания время является финалом sort из ключей.

3
27.01.2020, 22:06

Теги

Похожие вопросы