Описание тега lcy
Спасибо. Я понимаю два способа, которые вы упомянули. Почему арифметика расширения работают внутри параметра расширения, учитывая, что "Тильда расширения, параметра и переменной расширение, расширение арифметики, и подстановка команд (выполняется в направлении слева направо мода)"? Есть такое приложение в App переводчик выполняет эту работу Да!!! Так много раз я видел такси с местными номерами в небольших городах (таких как 5-55-55) и не было никакого шанса, что я когда-либо удаленного от моего сотового телефона, не зная, что 5 или шесть чисел из кода мне нужно.
Мой скрипт работает, если оба свои значения, разделенные разделителем, имеют одинаковое количество символов.
Если вы хотели произвольное количество пробелов, это было бы вообще возможно, потому что ты можешь попасть в такие ситуации:
ключ1 12/1222 10/15
ключ1 12 10
ключ1 1222 15
В этой ситуации вы просто не можете выровнять '15' в колонке '10', поскольку в столбце уже занято '1222'.
Редактировать: я переписал код, поэтому он принимает произвольное количество строк и произвольное число труб тоже :-)
Код:
script.sh:
#!/бин/Баш
# максимальное количество количество труб -> распознает количество линий
countPipes() {
Нум=0
строка="$@"
ИФС=' '
по пункту в $линии; делать
ТМП=$(Эхо "$элемент" | тр -д "[:alnum:][:пробел:]" | сан. узел-с)
если [[ "$Нум" < "$ТМП" ]]; затем
Нум=$ТМП
интернет
сделано
возврат $число
}
makeLines() {
strTmp="$@" # одну строку из входного файла
arrTmp=($strTmp)
ключ=${arrTmp[0]}
Аррин=ключ$
# создание выходного массива (один массив = одна выходная линия)
countPipes $strTmp
maxPipeCount=$? # присвоить значение последнего "возвращение"
для((Я=0;я<$maxPipeCount;++я)); делать
от arrout[$я]="ключ$"
сделано
по пункту в ${strTmp[@]}; делать
Обращение # разделитель
если [[ $предмет == *\|* ]]; тогда # если есть труба
ИФС='|'
ТМП=($элемент) # переменная, содержащая символ канала -> разделить пробелом -> массив
ИФС=' '
Аррин="$Аррин ${ТМП[0]}"
для ((Я=0;я<"${#от arrout[@]}";++я)); делать # заполнения столбцов в каждой строке вывода - i = индекс в строке
если [[ "${#ТМН[$(($я + 1))]}" -ГТ 0 ]]; затем
от arrout[$я]="${от arrout[$я]} ${ТМП[$(($я + 1))]}"
еще
# Обработка помещений в выходной
Для ((от j=0;j с<="${#ТМН[0]}";++J), В); сделать # заполнение строки с пробелами - от J = просто счетчик, а не Индекс
от arrout[$я]="${от arrout[$я]} "
сделано
интернет
сделано
Элиф [[ "$элемент" != "$ключ" ]]; тогда # если нет трубы
Аррин="$Аррин $элемент"
# Обработка помещений в выходной
для ((Я=0;я<"${#от arrout[@]}";++я)); делать # для каждой выходной линии
для J в { 1.."${#ТМН[0]}" }; делать # для каждого char в $пункт
от arrout[$я]="${от arrout[$я]} "
сделано
сделано
интернет
сделано
РЕЗУЛЬТАТЫ # ПЕЧАТЬ
Эхо "$Аррин"
для((Я=0;я<"${#от arrout[@]}";++я)); делать # для каждой выходной линии
эхо "${от arrout[$я]}"
сделано
отключено от arrout
Эхо '-----------------------------------------------------------'
}
в то время как чтение строки; данные нагрузки # из stdin
makeLines $линия
сделано
Пример:
test.txt:
ключ1 10/15 20 30 11|ХХ|55 21 31/20 100
ключ2 11 25/30 58/22 44 33
ключ3 12/15/17/19 22 33 55/22 88/44/11 ХХХХ|2222|7777
Команды:
Баш ./script.sh < test.txt
Выход:
ключ1 10 20 30 11 21 31 100
ключ1 15 ХХ 20
ключ1 55
-----------------------------------------------------------
ключ2 11 25 58 44 33
ключ2 30 22
-----------------------------------------------------------
ключ3 12 22 33 55 88 ХХХХ
ключ3 15 22 44 2222
ключ3 17 11 7777
ключ3 19
-----------------------------------------------------------