Как мне организовать список в специально отформатированный столбец в bash?

#awk #sed

#awk #sed

Вопрос:

Я работаю над сценарием, в котором мне нужно упорядочить некоторые выходные данные по столбцам по номеру строки. Итак, строка номер 5 должна перейти к строке номер 1, строка номер 6 должна перейти к строке номер 2 и т.д.

На самом деле нет шаблона между выводами, чтобы указать, какой из них следует переместить. Вывод всегда один и тот же, но просто ставит разрывы строк после каждого слова и сначала перечисляет названия категорий, а затем данные. Ниже у меня есть несколько примеров кода, а также то, как выглядит результат. Спасибо за вашу помощь!

 while :
do
    read -r -p ""${LINK}" ---> " LOOP
    case "${LOOP}" in
       
      1) command | tr ',' 'n' | tr -d '"' | printf '1m11n,pn'
      2) another command
      3) blah blah
    esac
done
  

При выполнении команды 1 выводится что-то вроде so (0 пробелов между ними)

 CategoryA  
CategoryB
CategoryC
CategoryD
Answer1
Answer2
Answer3
Answer4
  

Я пытаюсь отформатировать вывод для 1, чтобы он выглядел следующим образом

 CategoryA - Answer1
CategoryB - Answer2
CategoryC - Answer3
CategoryD - Answer4
  

Однако у меня возникли проблемы, я также попробовал следующее

 sed -e '1~11{h;d};G'
column -t
awk '{ print $2 " " $1}'
  

Я не лучший в форматировании, так как я новичок в программировании. Я могу извлекать данные из запросов, баз данных и т. Д. Просто нужно лучше форматировать выходные данные. Я ценю, что вы уделяете время своему дню, чтобы помочь с этим!

Ответ №1:

РЕДАКТИРОВАТЬ: поскольку OP полностью изменил образцы, теперь добавляя решение в соответствии с новыми образцами.

 awk '
BEGIN{ OFS=" - " }
match($0,/Category[^\]*/){
  val=substr($0,RSTART,RLENGTH)
}
!/Category/{
  found=1
}
found amp;amp; !/Category/{
  print arr[  count],$0
  next
}
{
  arr[FNR]=val
}
'  Input_file
  


Учитывая, что ваш Input_file выглядит так же, как и показанные образцы строго здесь, написал и протестировал его по следующей ссылке https://ideone.com/8XEVBW

 awk '
BEGIN{ OFS=" - " }
match($0,/[^0-9] /){
  val=substr($0,RSTART,RLENGTH)
}
prev!=val amp;amp; prev{
  found=1
}
found{
  print arr[  count],$0
  next
}
{
  arr[FNR]=$0
  prev=val
}
'  Input_file
  

Вывод будет следующим с показанными примерами.

 Example1 - Answer1
Example2 - Answer2
Example3 - Answer3
Example4 - Answer4