Aqui está um pequeno script awk que eu criei, que deve procurar linhas que correspondam aos seus índices. Basta colocá-lo em um arquivo (por exemplo, lookup.awk) e executar da seguinte forma:
lookup.awk
BEGIN {
# read lookup variables from the commandline and put them in an array
split(indexes, index_array, " ");
}
NR=1 {
# set the number of columns to the amount that's on the first line (only used for NA printing)
nr_of_fields = NF-1;
}
# For every line in your data file do the following
{
# check if the first field matches a value in the index array
for (var in index_array) {
if ($1 == index_array[var]) {
# when a match is found print the line and remove the value from the index array
print $0;
delete index_array[var];
next;
}
}
}
END {
# after all matching lines are found, print "NA" lines for the indexes that are still in the array
for (var in index_array) {
printf index_array[var];
for (i=1; i<nr_of_fields; i++) {
printf " NA";
}
printf "\n";
}
}
Você pode executá-lo assim:
$ awk -f ./lookup.awk -v indexes="1 2 3 4 5 6 7 8 9 10" data.txt | sort -n
1 10 20 30 . . -1
2 20 30 40 . . -2
3 30 40 50 . . -3
4 40 50 60 . . -4
5 NA NA NA NA NA
6 60 60 70 . . -5
7 NA NA NA NA NA
8 80 70 80 . . -6
9 NA NA NA NA NA
10 100 80 90 . . -7
Por favor, note que este script awk não produz os valores em alguma ordem como seu índice (que requer alguma lógica extra).