Как сортировать строки текста по другим строкам текста в качестве ключей?

В основном эквивалент метода «сортировки» в CLI.

Пример входного файла (file1.txt):

one
three
five
eleven
thirteen
sixteen

Другой входной файл (file2.txt, в котором указана длина соответствующей строки в file1.txt):

3
5
4
6
8
7

Желаемый результат (отсортировать строки в file1.txt по строкам в file2.txt, в данном случае численно; или, другими словами, отсортировать строки в file1.txt по длине строки):

one
five
three
eleven
sixteen
thirteen

Для этого я создал простой Perl-скрипт. Пример использования:

% sort-by-lines file1.txt file2.txt
% sort-by-lines /etc/passwd <(perl -nE'say length' /etc/passwd)

Но мне было интересно, может ли комбинация более простых команд Unix (sort, cut и т. д.) сделать то же самое сравнительно простым способом.

Вы должны включить несколько строк одинаковой длины в свой ввод и явно указать/показать, должен ли их порядок ввода быть сохранен в выводе.

Ed Morton 18.05.2019 18:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы просто пытаетесь отсортировать файл по длине каждой строки? Со стандартными инструментами в любой оболочке в любой системе UNIX это будет:

awk -v OFS='\t' '{print length(), NR, $0}' file | sort -k1,2n | cut -f3-

Например:

$ cat file
other stuff
text
foo
stuff
bar

$ awk -v OFS='\t' '{print length(), NR, $0}' file | sort -k1,2n | cut -f3-
foo
bar
text
stuff
other stuff

Если это не так, отредактируйте свой вопрос, чтобы уточнить, что вы пытаетесь сделать, и каков ваш фактический вопрос.


Обновление - учитывая ввод, который вы добавили к своему вопросу:

$ paste file2.txt file1.txt | sort -k1,2n | cut -f2-
one
five
three
eleven
sixteen
thirteen

Обратите внимание, что это не обязательно сохранит порядок строк одинаковой длины — вам нужно добавить параметр GNU -s («стабильный») к sort, чтобы сделать это:

paste file2.txt file1.txt | sort -s -k1,2n | cut -f2-

или сделайте это только для bash:

paste file2.txt <(cat -n file1.txt) | sort -k1,2n | cut -f3-

или это, которое переносится на все оболочки/Unixes:

awk -v OFS='\t' 'NR==FNR{a[NR]=$0;next} {print a[FNR], FNR, $0}' file2.txt file1.txt | sort -k1,2n | cut -f3-

или сделайте что-нибудь с явным временным файлом или здесь документом.

Ах да, так что решение просто sort -k. Спасибо!

Perl Ancar 18.05.2019 18:19

Другие вопросы по теме