Вы можете автоматизировать и обобщить обработку входного файла, чтобы разрешить любые имена атрибутов и любое количество имен атрибутов, а не только девять, показанные в OP:
"subject code"
"date of birth"
"favorite activities"
"height (m)"
"weight (lbs)"
"test score + standard deviation"
"color blind"
"number of siblings"
"average score"
Один из способов сделать это с помощью awk:
awk -v i=0 -v nAtt=9 '
/table columns are:/ {i+=1;ii=nAtt*(i-1);next}
!/(^$|^[0-9]+ +([0-9]+\.*[0-9]+ +)*.+)/ {ii+=1;a[ii]=$0}
/^[0-9]+ +([0-9]+\.*[0-9]+ +)*.+/
{printf "\n%s\n", $(nAtt+1);
c=0;
for(ii-=nAtt;ii++<1+(nAtt-1)*i;) {c++;printf "%-34s%s\n",a[ii],$c}}
' file.txt
Пояснение:
/.../
, или против сопоставления -, как!/.../
awk
я передаю в него две внешние переменные с опцией -v
:i=0
и nAtt=9
. i
представляет собой ранг блока данных (, т. е. порядковый номер блока атрибутов во входном файле :file.txt
), а nAtt
— количество атрибутов, которое в этом решении должно быть одинаковым для всех данных. блокировать. awk
видит шаблон table columns are:
, он понимает, что новый блок данных начинается со следующей записи, устанавливает два счетчика i
и ii
и переходит к следующему записывать. 56 6.18 1307 5.73 167 0.564 2 3 1.7 subject_8293748/label/NMA.label
, затем увеличивайте счетчик массива a
ii
и начинайте заполнять массив строками имен атрибутов, пока не достигнете...56 6.18 1307 5.73 167 0.564 2 3 1.7
, за которой следует любое количество символов, напечатать (nAtt+1)
-е поле в этой записи, затем напечатать nAtt
имена и значения атрибутов, по одному в каждой строке, таким образом, чтобы имена атрибутов выравнивались по левому краю и усекались, если их длина превышала 34 символа. Как упоминалось ранее:
внешние переменные могут быть переданы в awk
, например, с помощью:
awk -v i=$i -v nAtt=$nAtt '...'