Следующее, кажется, работает на меня
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 $@)
}
Я использовал бы режим абзаца 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
из ключей.