отсортировать часть имени

Ваша подстановка команд излишне сложна.

Вместо:

cells=$( awk '/rx cells/ { print $NF }' <"$co_result" )
printf 'Var_value: %s\n' "$cells"

$NFбудет последним полем, разделенным пробелом -в строке, и оно печатается, если строка содержит строку rx cells.

Также убедитесь, что входной файл является текстовым файлом Unix, а не текстовым файлом DOS. Запустите dos2unixдля файла, чтобы преобразовать его в текстовый файл Unix.


Глядя на вашу команду:

grep -e 'cells' $co_result | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0"";next;}1'

Первый:grep -e 'cells' $co_resultзавершится ошибкой, если $co_resultсодержит пробел, табуляцию, новую строку или любой другой специальный символ (, поскольку он не заключен в кавычки ).

Вывод команды

tx cells  : 468
rx cells  : 1707

Тогда:cut -d: -f2. Это выводит

 468
 1707

Тогда:awk '{print $1}'. Это выводит то же самое, что и выше, но с удаленными начальными пробелами

Тогда:awk 'NR%2{printf $0"";next;}1'.Это запутанный способ сделать paste -d' ' - -и вывести

468 1707

Позже echoвыведет

Var_value: 468 1707

Причина, по которой вы этого не видите, заключается в том, что ваш входной файл является текстовым файлом DOS и содержит символы возврата каретки в конце каждой строки. Поэтому курсор возвращается к началу строки после печати 468.

Используйте dos2unixво входном файле.

Откуда вы взяли 530, я не знаю.

3
10.05.2020, 17:40
1 ответ

С помощью zshвы можете определить функцию групповой сортировки, например:

digitsOnly() REPLY=${REPLY//[^0-9]} # removes all non-digits

, а затем используйте его как:

print -rC1 -- *(no+digitsOnly)

Здесь квалификатор nglob превращает параметр numericglobsortдля этого одного расширения glob, и o+functionсортирует на основе вывода (через$REPLY)из function.

print -rC1печатает свои аргументы raw в колонке 1c.

Помните, что если вы используете ls, lsпо умолчанию сортирует список файлов перед печатью (в алфавитном порядке ). В реализации GNU lsэтой сортировки можно избежать с помощью опции -U:

.
ls -ldU -- *(no+digitsOnly)

Вы можете сделать что-то подобное с perlс:

perl -le 'sub digitsOnly {$_=shift; s/\D//gr};
          print for sort {digitsOnly($a) <=> digitsOnly($b)} <*>'

Или запустить команду для этого списка файлов:

perl -l0e 'sub digitsOnly {$_=shift; s/\D//gr};
           print for sort {digitsOnly($a) <=> digitsOnly($b)} <*>' |
   xargs -r0 ls -ldU --
4
28.04.2021, 23:15

Теги

Похожие вопросы