1) Com sed
Supondo que step
e weight
ocorram em linhas consecutivas,
$ sed -nE '/step/{N;s/.*step\s+(\S+).*\n.*weight\s+(\S+).*/\t/p}' ip.txt
0 1.00000000000000e-01
100 1.00000000000000e-01
-
-nE
não imprime linhas por padrão e usa regex estendido -
/step/
corresponde se as linhas contiveremstep
-
N
para obter a próxima linha
Nota:
O acima foi testado em GNU sed 4.2.2
. O abaixo pode ajudar no OS X e outras versões. Veja este Q & A sobre SO para detalhes, ponto principal sendo \s
pode não funcionar da mesma forma que o GNU sed
sed -nE '/step/{N;s/.*step[[:space:]]+([^[:space:]]+).*\n.*weight[[:space:]]+([^[:space:]]+).*/\t/p}' ip.txt
2) Com awk
$ awk 'a ~ /step/ && /weight/{print v"\t"$2} {a=$0; v=$2}' ip.txt
0 1.00000000000000e-01
100 1.00000000000000e-01
-
{a=$0; v=$2}
salva a linha e o segundo campo -
a ~ /step/ && /weight/
corresponde se a linha anterior contémstep
e a linha atual contémweight
Supondo que os blocos hill
sejam todos semelhantes à entrada fornecida, podemos combinar três linhas consecutivas para restringir a correspondência apenas a hill
blocks
awk 'b ~ /hill/ && a ~ /step/ && /weight/{print v"\t"$2} {b=a; a=$0; v=$2}' ip.txt
Para salvar os resultados, adicione > output_filename
ao fim do comando
Referência: