Сортировка в bash

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

cut -f <column_number> <filename> | sort | uniq -c

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

105 Linux
55  MacOS
500 Windows

Я хочу сделать вместо сортировки по именам столбцов (которые в этом примере являются именами ОС). Я хочу сортировать их по счету и, возможно, иметь счет во втором столбце в этом формате вывода. Так что это должно выглядеть так:

Windows 500
MacOS   105
Linux   55

Как это сделать?

Ответы

Ответ 1

Использование:

cut -f <col_num> <filename>
    | sort 
    | uniq -c
    | sort -r -k1 -n
    | awk '{print $2" "$1}'

Сорт sort -r -k1 -n сортируется в обратном порядке, используя первое поле в виде числового значения. awk просто меняет порядок столбцов. Вы можете протестировать добавленные команды конвейера таким образом (с лучшим форматированием):

pax> echo '105 Linux
55  MacOS
500 Windows' | sort -r -k1 -n | awk '{printf "%-10s %5d\n",$2,$1}'
Windows      500
Linux        105
MacOS         55

Ответ 2

Mine:

cut -f <column_number> <filename> | sort | uniq -c | awk '{ print $2" "$1}' | sort

Это изменит порядок столбцов (awk), а затем просто отсортирует вывод.

Надеюсь, это поможет вам

Ответ 3

Использование sed на основе Tagged RE:

cut -f <column_number> <filename> | sort | uniq -c | sort -r -k1 -n | sed 's/\([0-9]*\)[ ]*\(.*\)/\2 \1/'

Не производит вывод в опрятном формате все же.