Для GNU awk.Он обрабатывает файл дважды.В первый раз он проверяет все записи, для которых строковые индексы имеют только пробел, и рассматривает непрерывные последовательности пробелов в качестве строк-разделителей, образующих FIELDWIDTHS
переменную .Во второй раз он использует это для обработки данных с фиксированной шириной.
a[i]
: s получает значение 0/1 и h
(заголовок) с этим вводом будет 100010101, что приводит к FIELDWIDTHS="4 2 2 1"
:
1 A 1 4
2 2 4
3 4 4
3 7 B
1 U 2
| | | |
100010101 - while(match(h,/10*/))
\ /|/|/|
4 2 2 1
Сценарий:
$ awk '
NR==FNR {
for(i=1;i<=length;i++) # all record chars
a[i]=((a[i]!~/^(0|)$/) || substr($0,i,1)!=" ") # keep track of all space places
if(--i>m)
m=i # max record length...
next
}
BEGINFILE {
if(NR!=0) { # only do this once
for(i=1;i<=m;i++) # ... used here
h=h a[i] # h=100010101
while(match(h,/10*/)) { # build FIELDWIDTHS
FIELDWIDTHS=FIELDWIDTHS " " RLENGTH # qnd
h=substr(h,RSTART+RLENGTH)
}
}
}
{
print $2 # and output
}' file file
И вывод:
A
4
U
Однако вам нужно обрезать пространство по полям.