В основном эквивалент метода «сортировки» в 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
и т. д.) сделать то же самое сравнительно простым способом.
Вы просто пытаетесь отсортировать файл по длине каждой строки? Со стандартными инструментами в любой оболочке в любой системе 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
. Спасибо!
Вы должны включить несколько строк одинаковой длины в свой ввод и явно указать/показать, должен ли их порядок ввода быть сохранен в выводе.