Похоже, что поля могут быть разделены на несколько пробелов, затем вы можете попробовать использовать FS = "*\047 *| +
", таким образом, ваши окончательные ожидаемые строки (на основе NR==1
) могут быть разбиты на столбцы eXXX (из *)От 1003 * до $(NF-2)
), обычный столбец, если существует в $(NF-1)
.и $ 1, и $ NF всегда ПУСТО..
$ cat t17.1.awk
BEGIN{ FS = " *\047 *| +"; OFS = "\t"; }
# on the first line, set up the total N = NF
# the keys and value lengths for the 'eXXX' cols
# to sort and format fields for all rows
NR == 1 {
N = NF
for (i=2; i < N-1; i++) {
n1 = split($i, a, " ")
e_cols[i] = a[n1]
e_lens[i] = length($i)
}
# the field-length of the regular column which is non eXXX-cols
len_last = length($(NF-1))
}
{
printf "\047 "
# hash the e-key for field from '2' to 'NF-1'
# include NF-1 in case the last regular column is missing
for (i=2; i < NF; i++) {
n1 = split($i, a, " ")
hash[a[n1]] = $i
}
# print the eXXX-cols based on the order as in NR==1
for (i=2; i < N-1; i++) {
printf("%*s%s", e_lens[i], hash[e_cols[i]], OFS)
}
# print the regular column at $(NF-1) or EMPTY if it is an eXXX-cols
printf("%*s\047\n", len_last, match($(NF-1),/ e[0-9]+$/)?"":$(NF-1))
# reset the hash
delete hash
}
Запустите приведенный выше скрипт, и вы получите следующий результат: (Обратите внимание, я добавил одну дополнительную строку, так что eXXX-cols + 14411.7647 e123
находится наконец строки перед трейлингом '
)
$ awk -f t17.1.awk file.txt
' 14411.7647 e0 - 2647.0588 e3 + 7352.9412 e12 + 14411.7647 e123 21828.2063'
' - 2647.0588 e3 + 7352.9412 e12 7814.9002'
' 14411.7647 e0 + 14411.7647 e123 20381.3131'
' 14411.7647 e0 + 14411.7647 e123 20381.3131'
' 0.0000 e0 + 0.0000 e123 1.9293e-12'
' 14411.7647'
' + 14411.7647 e123 '
Примечание:
вам может понадобиться gawk чтобы "%*s"
работал для printf()
, в случае, если он не работает, попробуйте фиксированное число, например: printf("%18s%s", hash[e_cols[i]], OFS)
некоторые значения в электронных полях могут иметьбольшего размера, чем соответствующий в NR == 1, чтобы исправить это, вы можете вручную указать массив для длин или просто использовать фиксированное число