it-swarm.com.ru

Сортировка файла с разделителями табуляции

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

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'

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

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

154
neversaint

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

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

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

277
Lars Haugseth

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

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

sort -k4nr file.txt

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

10
laalto

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

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

4
Brian Carlsen

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

2
Lloyd

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

1
Michiel Buddingh

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

Решение вашей проблемы очень просто на языке сценариев, таких как 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
James Thompson

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

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

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

C:\>cat foo.bat

sort -k3 -t"    " tabfile.txt
1
Lawrence Noronha

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

0
Danny

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

tr " " "\t" < <file> | sort <options>
0
The Unfun Cat