Упорядочить данные в табличном формате

#shell #awk #sed

#оболочка #awk #sed

Вопрос:

У меня есть входной файл в виде

 cell 1
Input A1;
Input A2;
Input B;
Output Z;
Type comb
Function  ((A1 A2) B) ;
cell 2
Input A1;
Input A2;
Input B;
Input C;
Output Z;
Type comb
Function  (((A1 A2) B) C) ;
  

Могу ли я представить выше в табличной форме как

 cell    Input       Output   Type  Function 
1       A1,A2,B     Z        comb  ((A1 A2) B
2       A1,A2,B,C   Z        comb  (((A1 A2) B) C)
  

Используя column команду, я получаю cell,input,output, Type, function параметры в строке, но я хочу затем в виде столбца.

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

Комментарии:

1. Пожалуйста, добавьте свои усилия в виде кода в свой вопрос, что настоятельно рекомендуется на SO, спасибо.

2. Я попытался использовать цикл for и обрабатывать каждый параметр, присваивать его переменной и печатать эту переменную с помощью команды echo, но на выходе отображаются все ячейки вместе, все входные данные вместе и т.д. Он не отображается в правильном формате.

3. Конечно, спасибо, что сообщили о ваших усилиях, пожалуйста, добавьте их в свой вопрос, в этом нет ничего плохого или правильного, мы все здесь, чтобы учиться, приветствия.

Ответ №1:

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

 awk '
BEGIN{
  OFS="t"
  print "celltInputtoutputttypetfunction"
}
{
  sub(/; /,"")
}
/^cell/{
  if(value["cell"]){
    print value["cell"],value["input"],value["output"],value["type"],value["func"]
    delete value
  }
  value["cell"]=$NF
  next
}
/^Input/{
  value["input"]=(value["input"]?value["input"] ",":"")$NF
  next
}
/^Output/{
  value["output"]=(value["output"]?value["output"] ",":"")$NF
  next
}
/^Type/{
  value["type"]=(value["type"]?value["type"] ",":"")$NF
  next
}
/^Function/{
  sub(/[^  ]*  /,"")
  value["func"]=(value["func"]?value["func"] ",":"")$0
  next
}
END{
  if(value["cell"]){
    print value["cell"],value["input"],value["output"],value["type"],value["func"]
  }
}' Input_file | column -t -s $'t'
  

Вывод будет следующим.

 cell  Input      output  type  function
1     A1,A2,B    Z       comb  ((A1 A2) B)
2     A1,A2,B,C  Z       comb  (((A1 A2) B) C)