Используйте vim-bindings в командной строке в bash:
set -o vi
В других программах, использующих readline, нажмите control-alt-j, чтобы переключиться с emacs на привязки vim.
Используя bash , это поможет:
$ sort -t$'\t' -k3 -nr file.txt
Обратите внимание на знак доллара перед строкой в одинарных кавычках. Вы можете прочитать о его можно найти в разделах ANSI-C Quiting bash справочной страницы .
По умолчанию разделитель полей непустой для перехода к пустому, поэтому табуляция должна работать нормально.
Однако столбцы имеют индекс с базой 1 и базой 0, поэтому вы, вероятно, захотите
sort -k4nr file.txt
для сортировки file.txt по столбцу 4 в обратном порядке. (Хотя данные в вопросе содержат даже 5 полей, поэтому последним полем будет индекс 5.)
В целом хранение таких данных - не лучший вариант, если вы можете этого избежать, потому что люди всегда путают табуляции и пробелы.
Решение вашей проблемы очень просто на языке сценариев, таком как Perl, Python или Ruby. Вот пример кода:
#!/usr/bin/perl -w
use strict;
my $sort_field = 2;
my $split_regex = qr{\s+};
my @data;
push @data, "7 8\t 9";
push @data, "4 5\t 6";
push @data, "1 2\t 3";
my @sorted_data =
map { $_->[1] }
sort { $a->[0] <=> $b->[0] }
map { [ ( split $split_regex, $_ )[$sort_field], $_ ] }
@data;
print "unsorted\n";
print join "\n", @data, "\n";
print "sorted by $sort_field, lines split by $split_regex\n";
print join "\n", @sorted_data, "\n";
пропустите его через что-то вроде awk '{print print $ 1 "\ t" $ 2 "\ t" $ 3 "\ t" $ 4 "\ t" $ 5}'
. Это изменит пробелы на табуляцию.