Вы можете получить то, о чем просили:
$ cat tst.awk
BEGIN { OFS=" | " }
/^PERMNO/ {
permnos = ( permnos == "" ? "" : permnos ",") $NF
}
/^ +[[:alpha:]]/ && !doneHdr++ {
indent = text = $0
sub(/[^ ].*/,"",indent)
sub(/^ +/,"",text)
hdr = text OFS "PERMNO"
sep = sprintf("%*s",length(hdr)+2,"")
gsub(/ /,"-",sep)
print "Market data:" ORS ORS indent hdr ORS indent sep
}
/^ +[0-9]/ {
print $0, permnos
permnos = ""
}
$ awk -f tst.awk file
Market data:
Date | Price | Return | Volume | PERMNO
-----------------------------------------
2019-01-01| 120 | 100 | 100 | 1234,2134
2019-01-01| 200 | 150 | 130 | 3456
но я настоятельно рекомендую вам просто сгенерировать CSV вместо этого для удобства дальнейшего анализа / манипуляции:
$ cat tst.awk
BEGIN { FS="[ |]+"; OFS="," }
/^PERMNO/ {
permnos = ( permnos == "" ? "" : permnos " ") $NF
}
sub(/^ +/,"") {
$1 = $1
if ( /^[[:alpha:]]/ && !doneHdr++ ) {
print $0, "PERMNO"
}
else if ( /^[0-9]/ ) {
print $0, permnos
permnos = ""
}
}
$ awk -f tst.awk file
Date,Price,Return,Volume,PERMNO
2019-01-01,120,100,100,1234 2134
2019-01-01,200,150,130,3456
Вы всегда можете создать формат таблицы из этого, если вам нравится использовать различные инструменты, например, с column
:
$ awk -f tst.awk file | column -s, -o' | ' -t
Date | Price | Return | Volume | PERMNO
2019-01-01 | 120 | 100 | 100 | 1234 2134
2019-01-01 | 200 | 150 | 130 | 3456
и если вам нравится эта строка подчеркивания под заголовком:
$ awk -f tst.awk file | column -s, -o' | ' -t | awk '1;NR==1{gsub(/./,"-");print}'
Date | Price | Return | Volume | PERMNO
---------------------------------------------
2019-01-01 | 120 | 100 | 100 | 1234 2134
2019-01-01 | 200 | 150 | 130 | 3456