Сортировка в 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/'
Не производит вывод в опрятном формате все же.