Не совсем ответ на вопрос о длине строки режима, но обходной путь:
В итоге я использовал коды ANSI CSI для сохранения и восстановления позиции курсора. (Спасибо @tripleee за указатель).
Я все еще не мог найти длину строки режима, даже когда пытался получить позицию курсора с помощью PS1=$(getColumn)
, где getColumn
- это различные вещи, которые я пробовал на основе:
Мой обходной путь с использованием кодов ANSI CSI можно найти как в ответе на "Right align part of prompt".
Я очень доволен этим обходным решением, поскольку мне удалось сделать это без единого подпроцесса, и сделать его shellcheck
-чистым.
Я не уверен, чего именно вы хотите, поскольку вы слишком зациклены на сортировке/уникализации.
Однако, если все, что вам нужно, это обрезать повторяющиеся строки, например, 4,5,6 и 8,9,10, тогда вы можете сделать это в своем последнем файле, который вы показываете, который содержит строки //NODECLASS:
perl -F\" -lane '
print,next if $. < 3;
print if ! $h{($F[1] =~ /:(.*?):/)[0]}++;
' NODE_CLASS_file
где первые 2 строки пропущены. В остальном мы смотрим на 2-е поле, число между:/:(.*?):/
предоставит вам число, после чего вам нужно попасть в скалярный контекст, поместив его в (...)[0]
и передать его как ключ к хешу %h
. Печатать текущую строку, только если этот ключ еще не был замечен.
Мне удалось найти грубое решение, в котором я добавляю начальные -конечные позиции в файл вкладок в виде отдельного столбца. Затем при создании файла Nodeclass я также извлекаю этот столбец и использую sort | uniq -c на основе этого вместо столбца последовательности. Кажется, он делает то, что я хотел, но немного медленнее, потому что скрипт, создающий файл вкладки, должен создать целый дополнительный столбец! Спасибо:)