如何将列表组织成bash中特定格式的列?

问题描述

我正在处理一个脚本,在该脚本中我需要按行号将一些输出组织成列。因此,第5行需要转到第1行,第6行需要转到第2行,依此类推。

输出之间实际上并没有一种模式可以确定应该移动哪一个输出始终是相同的,但是只是在每个单词之后放置换行符,然后首先列出类别名称,然后列出数据。下面有一些示例代码,以及输出的样子。谢谢您的帮助!

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

运行命令1时,它会输出类似的内容(中间有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}'

我不是最擅长格式化的,因为我刚接触编码。我可以从查询数据库等中提取数据。只是必须更好地格式化输出。感谢您抽出宝贵时间为您提供帮助!

解决方法

编辑: 由于OP完全更改了示例,因此现在按新示例添加解决方案。

awk '
BEGIN{ OFS=" - " }
match($0,/Category[^\\]*/){
  val=substr($0,RSTART,RLENGTH)
}
!/Category/{
  found=1
}
found && !/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,RLENGTH)
}
prev!=val && prev{
  found=1
}
found{
  print arr[++count],$0
  next
}
{
  arr[FNR]=$0
  prev=val
}
'  Input_file

输出结果如下所示。

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