awk решение:
awk 'BEGIN{FS="[\t ]+"; OFS="\t"}NR==1{for(i=2;i<=NF;i++)
{if($i~/VI/) a[i]; }}{r=$1; for(i in a) r=r OFS $i; print l}' file
Вывод:
OVI 1VI 3VI
er 23 23 23
tr 24 24 24
FS="[\t ]+"
- разделитель полей ввода
OFS="\t"
- поле вывода разделитель
NR==1
- для первой строки header
if($i~/VI/) a[i]
- номер поля захвата, если он соответствует VI
r=1$; for(i in a) r=r OFS $i; print r
- итерация по необходимым номерам полей и вывод их соответствующих значений
Если вы столкнулись с нарушением порядка, используйте следующее с функцией asorti()
(для сортировки массива по индексам):
awk 'BEGIN{FS="[\t ]+"; OFS="\t"}NR==1{for(i=2;i<=NF;i++)
{if($i~/VI/) a[i]; }}{r=$1; asorti(a,b); for(i in b) {r=r OFS $(b[i])} print r}' file