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

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

Я понятия не имею, как это сделать. (В 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 удаляет из этого первого столбца.

  • Как сортировать файлы по части имени файла?
  • Помогите мне понять, что здесь делает
  • Как можно сортировать поле CPU команды ps?
  • sort: write failed | Сломанная труба
  • команды сортировки и uniq не работают, как ожидалось, когда выполняются cron
  • Сортировка с неравными пробелами в первом столбце
  • Эффективное объединение / сортировка / уникальное большое количество текстовых файлов
  • Порядок сортировки для заказа этого списка в определенном порядке
  • Перемещение строки с выхода на фронт вывода или пользовательское переупорядочение
  • Как отсортировать по 2 столбцам и сохранить верхнюю строку из каждой группы?
  • Почему эта команда не сортируется на основе индекса uniq?
  • Установленный coreutils на CentOS для sort -human-readable флага, но он все еще не работает
  • Linux и Unix - лучшая ОС в мире.