Сортировать числовые значения кроме текста в Bash - PullRequest
1 голос
/ 27 марта 2019

У меня есть CSV-файл с именем Prices.csv, который выглядит следующим образом:

Name, Price, Description
Apple, 2.85, fruit
Kiwi, 1.96, fruit
Banana, 0.99, fruit
Peach, Not available, fruit
Orange, 2.02, fruit

Я бы хотел отсортировать второй столбец (Цена) в порядке возрастания, за исключением значений, которые «недоступны», их следует поместить внизу.

То, что я до сих пор делал, это:

sort -t, -k2,2 -n prices.csv > ordered_prices.csv

Это создает следующий файл:

Name, Price, Description
Peach, Not available, fruit
Banana, 0.99, fruit
Kiwi, 1.96, fruit
Orange, 2.02, fruit
Apple, 2.85, fruit

Как вы можете видеть, товары с ценой «Нет в наличии» располагаются сверху, а не снизу. Как разместить текст внизу с общим кодом?

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Если у вас есть gnu-awk, вы можете сделать это, используя PROCINFO:

awk -F ', ' 'NR == 1 {
   print
   next
}
$2+0 == $2 {
   a[NR] = $2
   rec[NR] = $0
   next
}
{
   rest = rest $0 RS
}
END {
   PROCINFO["sorted_in"] = "@val_num_asc"
   for (i in a)
      print rec[i]
   printf "%s", rest
}' file

Name, Price, Description
Banana, 0.99, fruit
Kiwi, 1.96, fruit
Orange, 2.02, fruit
Apple, 2.85, fruit
Peach, Not available, fruit

В качестве альтернативы вы можете использовать команду head + tail + sort, например:

head -n 1 file && sort -t, -k2V <(tail -n +2 file)
1 голос
/ 27 марта 2019

Вы можете использовать сортировку версий вместо числовой сортировки:

$ sort -t, -k2,2V  prices.csv > ordered_prices.csv

Более подробную информацию о сортировке версий можно найти здесь . Обратите внимание, что это переместит ваш заголовок назад. Вы можете использовать этот метод:

$ OUTPUTFILE=outputfile
$ awk -v out="$OUTPUTFILE" '(NR==1){print > out; close(out)}(NR>1)' inputfile \
  | sort -t, -k2,2V > $OUTPUTFILE

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

Другой способ сделать это - сделать нелепую подстановку:

$ sed '2,$s/\([[:alpha:]]\+\)/999999\1/g' | sort -t, -k2n | sed 's/999999//g'

, который удерживает заголовок на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...