Как отсортировать строки текста по другим строкам текста в качестве ключей? - PullRequest
2 голосов
/ 18 мая 2019

В основном эквивалент метода «сортировки» в 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 и т. Д.) Сделать то же самое сравнительно простым способом.

1 Ответ

4 голосов
/ 18 мая 2019

Вы просто пытаетесь отсортировать файл по длине каждой строки?Со стандартными инструментами в любой оболочке на любой машине 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 ("stable") к 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-

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...