Как выровнять n-й столбец с несколькими строками - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть 3 переменные, которые я использую printf для выравнивания их выходных данных. Я знаю, что первая переменная env - это одна строка, поэтому и 2-я переменная. Проблема с 3-й переменной заключается в том, что эта переменная имеет огромный вывод, поэтому я хотел бы перечислитьони выровнены (я надеюсь, что ниже прояснит мой вопрос)

** У меня нет команды столбца **

Я использую

printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA}"


OUT11                OUT2  OUT3
----------           ----- --------------
GATE1                14    CU4 CU2 CU9var CU3 CU1 CU11admin CU10opt not_sy 
CU_doonce cutttCU clocal_CU global_CU tivoli_CU 
GATE2                70    gdba_CU cdba_CU vudb_CU tti1_CU tti3_CU tt3_CU
3c2_CU tt3c3_CU tt3c4_CU tt3d1_CU tt3a1_CU tt3u1
3t3_CU tt3t4_CU tt4_CU utt4_CU tt4c1_CU tt4c2_CU
4d1_CU tt4a1_CU tt4u1_CU tt4t1_CU tt4t2_CU tt4t3
tt5_CU tt5c1_CU tt5c2_CU tt5c3_CU tt5c4_CU tt5d1
5t1_CU tt5t2_CU tt5t3_CU tt5t4_CU tt6_CU utt6_CU
6c3_CU tt6c4_CU tt6d1_CU tt6a1_CU tt6u1_CU tt6t1
6t4_CU tt7_CU utt7_CU tt7c1_CU tt7c2_CU tt7c3_CU
7a1_CU tt7u1_CU tt7t1_CU tt7t2_CU tt7t3_CU tt7t4

а мне они нужны как:

OUT11                OUT2  OUT3
----------           ----- --------------
GATE1                14    CU4 CU2 CU9var CU3 CU1 CU11admin CU10opt not_sy 
                           CU_doonce cutttCU clocal_CU global_CU tivoli_CU 
GATE2                70    gdba_CU cdba_CU vudb_CU tti1_CU tti3_CU tt3_CU
                           3c2_CU tt3c3_CU tt3c4_CU tt3d1_CU tt3a1_CU tt3u1
                           3t3_CU tt3t4_CU tt4_CU utt4_CU tt4c1_CU tt4c2_CU
                           4d1_CU tt4a1_CU tt4u1_CU tt4t1_CU tt4t2_CU tt4t3
                           tt5_CU tt5c1_CU tt5c2_CU tt5c3_CU tt5c4_CU tt5d1
                           5t1_CU tt5t2_CU tt5t3_CU tt5t4_CU tt6_CU utt6_CU
                           6c3_CU tt6c4_CU tt6d1_CU tt6a1_CU tt6u1_CU tt6t1
                           6t4_CU tt7_CU utt7_CU tt7c1_CU tt7c2_CU tt7c3_CU
                           7a1_CU tt7u1_CU tt7t1_CU tt7t2_CU tt7t3_CU tt7t4

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

Не могли бы вы попробовать следующее.

your_command | awk '
/GATE/{
  val=index($0,$3)
  while(++i<val){
    space=space OFS
  }
}
!/^GATE/{
  $0=space $0
}
1'

Один вкладыш:

your_command | awk '/GATE/{val=index($0,$3);while(++i<val){space=space OFS}} !/^GATE/{$0=space $0} 1'

ИЛИ согласно комментарию Эда сэра, попробуйте следующее:

your_command | awk '
/GATE/{
  space=sprintf("%*s",index($0,$3),"")
}
!/^GATE/{
  $0=space $0
}
1'
0 голосов
/ 08 ноября 2019

Вы используете следующую строку для печати своих строк:

$ printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA}"

Ваша проблема в том, что ${DATA} содержит символы новой строки. Мы можем сделать вывод, что вы пытаетесь напечатать строку длиной более 20 символов в поле шириной 20 символов (ваш формат показывает это). Именно эти символы новой строки гарантируют, что ваши данные продолжаются в начале следующей строки. Если вы хотите выровнять их, вам нужно сделать небольшую подстановку новых строк в этой переменной.

Пример:

$ p=$'foo\nbar'
$ printf "%-2s %1s\n" "a" "$p"
a  foo
bar
$ printf "%-2s %1s\n" "a" "${p//$'\n'/$'\n'   }"
a  foo
   bar

Вы знаете, что столбец DATA должен начинаться с символа 28. Перед ним 27 символов (20 + 1 + 5 + 1). Все, что вам нужно сделать, это:

$ printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA//$'\n'/$'\n'$(printf "%27s" "")}"

Это должно работать в bash или современном ksh. Если у вас этого нет, а подстановка переменных распознает ${var//str/repl}, вы можете быстро постобработать эту строку с помощью awk:

$ printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA}" \
  | gawk -v RS= '{gsub(ORS,ORS sprintf("%27s",""))}1'
0 голосов
/ 08 ноября 2019
#!/bin/bash
OUT="GATE1"
COUNT="14"
DATA="CU4 CU2 CU9var CU3 CU1 CU11admin CU10opt not_sy CU_doonce cutttCU clocal_CU global_CU tivoli_CU"
while [[ -n $DATA ]]
do
    printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA:0:48}"
    OUT=" "
    COUNT=" "
    DATA="${DATA:48}"
done
...