2016-09-20 4 views
0

4 списка приведены следующим образом. Мне нужно отсортировать их по first numerical column. Столбцы разделены на tabs/\t.Bash :: Как отсортировать по первому числовому столбцу файла?

France \t Paris \t 13.2 \t 14.2 
Germany \t Munich \t Hamburg \t 16.9 \t 16.6 
Norway \t 8.9 \t 9.1 
Spain \t Barcelona \t Madrid \t Malaga \t 21.2 \t 19.4 

После сортировки, эти столбцы будут выглядеть ->

Norway \t 8.9 \t 9.1 
France \t Paris \t 13.2 \t 14.2 
Germany \t Munich \t Hamburg \t 16.9 \t 16.6 
Spain \t Barcelona \t Madrid \t Malaga \t 21.2 \t 19.4 

Они сортируются по 8.9, 13.2, 16.9 & 21.2.

Я пробовал с чем-то вроде sort -k 2n или sort -k 3n, который сортирует списки в соответствии со вторым или третьим столбцом. Но, 8.9, 13.2, 16.9 & 21.2 расположены во 2-й, 3-й, 4-й & 5-й столбец в списках. Как я могу это решить?

+0

Восходящий порядок сортировки может быть, вы должны выглядеть так: http://stackoverflow.com/questions/27112190/shell-bash-script-to-print-numbers-in-ascending-order – limonik

+0

Нет, это разные тема. – jbsu32

+0

Этот первый числовой столбец выглядит как дата. Это числовая сортировка - правильный инструмент для работы? –

ответ

5

Как об этом:

sed -e 's/^[^0-9.]*\([0-9.]\+\).*$/\1\t\0/' input | sort -n | cut -f 2- 

Мы извлекаем первое числовое поле и вставляем его в начало каждой строки. Затем мы сортируем численно все строки, а затем удаляем материал, который мы добавили на первом шаге.

+0

Вы можете заменить этот 'sed' этим' awk': 'awk '$ 0 = $ (NF-1)" \ t "$ 0' input' –

1

Я удалил \t из входного файла для ясности, решение не зависит от расстояния между

$ cat ip.txt 
France Paris 13.2 14.2 
Germany Munich Hamburg 16.9 16.6 
Norway 8.9 9.1 
Spain Barcelona Madrid Malaga 21.2 19.4 

$ perl -lne '($k)=/([\d.]+)/; $h{$k}=$_; END{print $h{$_} foreach (sort {$a <=> $b} keys %h)}' ip.txt 
Norway 8.9 9.1 
France Paris 13.2 14.2 
Germany Munich Hamburg 16.9 16.6 
Spain Barcelona Madrid Malaga 21.2 19.4 
  • Первое число (в том числе десятичной запятой) используется в качестве ключа для сохранения входных линий в переменной хэш
  • После того как все строки считываются, ключи сортируются численно и соответствующие хэш-значения распечатываются
2

В Gnu AWK:

$ awk '{a[$0]=$(NF-1)} END {PROCINFO["sorted_in"]="@val_num_asc"; for(i in a) print i}' tst 
Norway 8.9  9.1 
France Paris 13.2 14.2 
Germany Munich Hamburg 16.9 16.6 
Spain Barcelona  Madrid Malaga 21.2 19.4 

Даунсайд: она удаляет повторяющиеся строки.

0

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

awk '{print $(NF-1),$0}' inputfile| sort -n | cut -f2- -d' ' 
Norway 8.9 9.1 
France Paris 13.2 14.2 
Germany Munich Hamburg 16.9 16.6 
Spain Barcelona Madrid Malaga 21.2 19.4 
Смежные вопросы