Depende de onde, com que frequência, por que etc. você faz isso, mas não faria mal colocá-lo em um script.
De qualquer forma, você poderia fazer algo assim para imprimir em ordem definida. Por este abordagem você também pode optar por imprimir apenas alguns selecionados. Por exemplo. apenas 1 e 3:
Um forro:
awk -v order=312 \
'/^/{ln[NR]=$0}END{split(order,a,"");
for(i in a)printf("%s\n",ln[a[i]]);}' \
sample.txt
Ou mais fácil de ler:
/^/{
ln[NR] = $0
}
END{
split(order,a,"");
for(i in a)
printf("%s\n",ln[a[i]]);
}
Para a divisão, você poderia adicionar um delimitador a mais de 9 linhas.
Por exemplo:
split(order,a,"-");
# and call by:
awk -v order=3-13-21-12-2 ...
Ou para oferecer suporte a vários:
if (order ~ /-/) split(order, a, "-"); # order has "-", split
else if (order ~ /\./) split(order, a, "."); # order has ".", split
else if (order ~/:/) split(order, a, ":"); # order has ":", split
else split(order, a, ""); # none presume numbers split all
Você também pode escolher combinar linhas como em:
BEGIN {
i = 0;
}
/^\s*Acct-Status-Type/ {ln[++i] = $0 }
/^\s*User-Name/ {ln[++i] = $0 }
/^\s*Event-Timestamp/ {ln[++i] = $0 }
END {
if (order ~ /-/) split(order, a, "-");
else if (order ~ /\./) split(order, a, ".");
else if (order ~/:/) split(order, a, ":");
else split(order, a, "")
for (i in a)
printf("%s\n", ln[a[i]]);
}
Editar:
Para a última amostra, isso provavelmente seria melhor. (Também atualizado o split ):
/^\s*Acct-Status-Type/ {ln[1] = $0 }
/^\s*User-Name/ {ln[2] = $0 }
/^\s*Event-Timestamp/ {ln[3] = $0 }
END {
if (split(order, a, "-|:|,| |\.") == 1) # Space require quoting of arg.
split(order, a, "")
for (i in a)
printf("%s\n", ln[a[i]]);
}