Сортировка файла с разделителями табуляции - PullRequest
160 голосов
/ 24 июня 2009

У меня есть данные в следующем формате:

foo<tab>1.00<space>1.33<space>2.00<tab>3

Теперь я попытался отсортировать файл по последнему полю по убыванию. Я попробовал следующие команды, но они не были отсортированы, как мы ожидали.

$ sort -k3nr file.txt  # apparently this sort by space as delimiter

$ sort -t"\t" -k3nr file.txt
  sort: multi-character tab `\\t'

$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt
  sort: multi-character tab `\\t'

Как правильно это сделать?

Вот примерные данные .

Ответы [ 9 ]

287 голосов
/ 24 июня 2009

Используя bash , это поможет:

$ sort -t$'\t' -k3 -nr file.txt

Обратите внимание на знак доллара перед строкой в ​​одинарных кавычках. Вы можете прочитать о это в разделах ANSI-C Цитирование bash man page .

10 голосов
/ 24 июня 2009

По умолчанию разделитель поля является непустым переходом к пустому, поэтому вкладка должна работать очень хорошо.

Однако столбцы индексируются с помощью базы 1 и базы 0, так что вы, вероятно, захотите

sort -k4nr file.txt

для сортировки файла file.txt по столбцу 4 в обратном порядке. (Хотя данные в вопросе имеют даже 5 полей, поэтому последним полем будет индекс 5).

4 голосов
/ 16 декабря 2014

Вам нужно поставить реальный символ табуляции после -t \ и сделать это в оболочке, нажав Ctrl-V и затем символ табуляции. Большинство оболочек, которые я использовал, поддерживают этот режим буквального ввода табуляции.

Однако, будьте осторожны, потому что копирование и вставка из другого места обычно не сохраняют вкладки.

3 голосов
/ 25 марта 2013

Решение $ не сработало для меня. Однако, фактически поместив сам символ табуляции в команду, сделал: sort -t '' -k2

1 голос
/ 12 июня 2014

Я хотел найти решение для сортировки Gnu в Windows, но ни одно из перечисленных выше решений не работало для меня в командной строке.

Используя подсказку Ллойда, у меня работал следующий пакетный файл (.bat).

Введите символ табуляции в двойных кавычках.

C:\>cat foo.bat

sort -k3 -t"    " tabfile.txt
1 голос
/ 24 июня 2009

В общем, хранить такие данные не очень хорошо, если вы можете их избежать, потому что люди всегда путают табуляции и пробелы.

Решение вашей проблемы очень просто на языке сценариев, таких как 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";
1 голос
/ 24 июня 2009

пропустите через что-то вроде awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'. Это изменит пробелы на вкладки.

0 голосов
/ 17 апреля 2018

Если вы хотите упростить для себя только наличие вкладок, замените пробелы вкладками:

tr " " "\t" < <file> | sort <options>
0 голосов
/ 12 ноября 2014

У меня была эта проблема с сортировкой в ​​cygwin в оболочке bash при использовании 'general-numeric-sort'. Если я указал -t$'\t' -kFg, где F - номер поля, он не работал, но когда я указал и -t$'\t', и -kF,Fg (например, -k7,7g для 7-го поля), это сработало. -kF,Fg без -t$'\t' не сработало.

...