сортировать файл по длине столбца / строки

Мне нужно отсортировать файл на основе количества символов в первом столбце.

Я понятия не имею, как это сделать. (В Linux, так что sed / awk / sort доступен).

Пример:

.abs is bla bla 12 .abc is bla se 23 bla .fe is bla bla bla .jpg is pic extension .se is for swedish domains 

я хочу сортировать эти строки, основываясь на длине первого столбца в каждой строке. Некоторые строки начинаются с 4 символов, некоторые начинаются с 3 или 2. Я хочу, чтобы результат был примерно таким:

 .fe is bla bla bla .se is for swedish domains .abs is bla bla 12 .abc is bla se 23 bla .jpg is pic extension 

Возможно ли это?

3 Solutions collect form web for “сортировать файл по длине столбца / строки”

Вы можете сначала добавить еще один столбец с количеством символов с awk , sort и затем добавить добавленный столбец:

awk '{printf "%d %s\n", length($1), $0}' file.txt | sort -n -k1,1 | sed -E -e 's/^[0-9]+ //'

Вы можете сделать это с помощью базовых инструментов оболочки , но если Perl доступен, вы можете прямо указать свое требование:

 perl -l -e 'print sort {@a = split(/ /, $a, 2); @b = split(/ /, $b, 2); length($a[0]) <=> length($b[0])} <>' 

С преобразованием Шварца (более эффективным для большого ввода):

 perl -l -e 'print map {$_->[0]} sort {length($a->[1]) cmp length($b->[1])} map {[$_, split(/ /, $_, 2)]} <>' 

Если у вас Python, код более подробный, но немного яснее:

 python -c 'import sys; lines = sys.stdin.readlines(); lines.sort(key=lambda line: len(line.split()[0])); sys.stdout.writelines(lines)' 
 $ awk -vOFS='\t' '{ print length($1), $0 }' file.in | sort -k1,1n -k2,2 | cut -f2- .fe is bla bla bla .se is for swedish domains .abc is bla se 23 bla .abs is bla bla 12 .jpg is pic extension 

Это сортирует файл file.in по длине данных в первом столбце, затем лексикографически по фактическим данным первого столбца (это не было специально запрошено в вопросе, но обеспечивает приятное прикосновение к результату).

Код awk будет создавать выходные данные с разделителями табуляции, например

 4 .abs is bla bla 12 4 .abc is bla se 23 bla 3 .fe is bla bla bla 4 .jpg is pic extension 3 .se is for swedish domains 

и это то, что сортируется по первому столбцу (численно), а затем по второму столбцу (лексикографически). Затем cut удаляет из этого первого столбца.

  • Помогите мне понять, что здесь делает
  • Сортировка ведет себя странно при сортировке с учетом регистра
  • Перечислите дни рождения в том порядке, в котором они придут с сегодняшнего дня
  • sort: write failed | Сломанная труба
  • Выбор и сортировка IP-адреса, поддерживающего всю строку
  • Как отсортировать поток данных по двум именам столбцов (номер столбца может отличаться)?
  • Сортировка вывода ls, где файлы заканчиваются цифрами
  • Как установить ls -lh со временем и длинным форматом даты в порядке убывания в .bashrc
  • Сортировка некоторых строк в файле
  • Как найти наиболее распространенное имя в файле passwd
  • Как я могу получить процесс с самым большим pid?
  • Interesting Posts

    Значение переменной \ перед средой

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

    Ошибка подключения Wi-Fi на Arch Linux

    Каково разрешение по умолчанию для папки / var?

    Как отключить историю командной строки сеанса оболочки в AIX 5-6?

    Что такое синтаксис ядра при загрузке из ZFS?

    / proc / pid / maps (и их преобразование)

    Где уходит трейлинг-символ новой строки из моей подстановки?

    Как настроить контейнеры Docker для уникальных IP-адресов, которые не являются стандартными?

    `du -s .` и` du -hs .` дают разные результаты (на OS X)

    Преимущества символических ссылок на ярлыки стиля Windows

    Привод USB3, подключенный к ПК, заставляет компьютер зависать «приветствовать,

    Копирование и вставка с помощью URxvt

    Перенаправление портов SNMP в маршрутизатор для использования с привязкой SNMP openHAB

    ln -s $ SOURCE / * except – с помощью find?

    Linux и Unix - лучшая ОС в мире.