Я думаю, я бы go об этом немного по-другому. Вместо того, чтобы захватывать первое подполе «:» в полях с 10 по 50 в массиве, я бы просто переписал эти поля in situ.
$1 == "X" {
$3=""
for (i=6; i<=9; i++)
$i=""
for (i=10; i<=NF; i++)
$i=substr($i,0,index($i,":")-1)
print
}
Обработка $3
здесь немного слабовата ; У awk нет реального решения для удаления столбца. Если вы не можете обработать дополнительные разделители, то может потребоваться более подробное описание:
$1 == "X" {
s=""
for (i=10; i<=NF; i++)
s=s OFS substr($i,0,index($i,":")-1)
print $1,$2,$4,$5 s
}
В этом решении пропущена запятая перед окончательным s
, поскольку OFS будет включен в качестве первого символа из этой строки. Это l̶a ,z unnei̶n̶e̶s̶s̶ оптимизация, чтобы избежать ненужных тестов, но вы также можете изменить это, чтобы избежать временной переменной, если вам нравится:
$1 == "X" {
printf "%s", $1 OFS $2 OFS $4 OFS $5
for (i=10; i<=NF; i++)
printf "%s", OFS substr($i,0,index($i,":")-1)
printf ORS
}
Мы используем printf
здесь, чтобы избежать ложных случаев ORS .
Я тестировал так:
$ cat input
X 2 3 4 5 6 7 8 9 10:a:b 11:c:d 12:e:f:g
$ awk -f test.awk input
X 2 4 5 10 11 12