다음을 포함하는 결과 파일이 있습니다.
==============================================
------------------------------
Begin SimulationInterface Evaluation 1
------------------------------
Parameters for evaluation 1:
-1.8961789208e+00 x1
-1.3853582017e+00 x2
Direct interface: invoking function
Active response data for SimulationInterface evaluation 1:
Active set vector = { 1 }
2.4892772154e+03 response_fn_1
------------------------------
Begin SimulationInterface Evaluation 2
------------------------------
Parameters for evaluation 2:
3.7988695564e-01 x1
1.5859091288e+00 x2
Direct interface: invoking function
Active response data for SimulationInterface evaluation 2:
Active set vector = { 1 }
2.0820416317e+02 response_fn_1
==================================
이제 결과 파일에서 정수 x1
, , 및를 x2
별도의 파일로 추출하고 싶습니다. 행을 사용하고 추출하려면 다음을 수행하십시오.response_fn_1
test
x1
x2
sed -n '/평가 매개변수/{n;p;n;p}'initial.log
합계 가 표 형식이 test
되도록 행의 정수를 출력 파일로 어떻게 전송할 수 있습니까 ?x1
x2
x1 x2
-1.8961789208e+00 -1.3853582017e+00
3.7988695564e-01 1.5859091288e+00
답변1
모든 작업을 수행하려면 awk를 사용하는 것이 좋습니다.
$ awk '
BEGIN {OFS="\t"; print "x1", "x2", "response_fn_1"}
$2 == "x1" {x1 = $1}
$2 == "x2" {x2 = $1}
$2 == "response_fn_1" {print x1, x2, $1}
' file | column -t
x1 x2 response_fn_1
-1.8961789208e+00 -1.3853582017e+00 2.4892772154e+03
3.7988695564e-01 1.5859091288e+00 2.0820416317e+02
파이프 스루는 column -t
예쁜 인쇄에만 사용됩니다. awk 출력 자체는 탭으로 구분됩니다.
답변2
결과 파일 이름이 "input"인 경우
for i in x1 x2 response_fn_1 ; do echo $i > $i; grep $i input | awk '{print $1}' >> $i ; done ; paste x1 x2 response_fn_1 | column -t
다음을 제공합니다:
x1 x2 response_fn_1
-1.8961789208e+00 -1.3853582017e+00 2.4892772154e+03
3.7988695564e-01 1.5859091288e+00 2.0820416317e+02
노트! 그러면 작업 중인 디렉터리에 x1 x2 및 response_fn_1이라는 파일이 파괴적으로 생성됩니다. 실제 파일인 경우 덮어쓰게 됩니다.
답변3
Perl을 slurp 모드로 사용하여 이 작업을 수행하고 Begin으로 시작하는 줄 주위의 배열로 파일을 분할할 수 있습니다(요구 사항에 맞게 수정할 수 있음). 그런 다음 각 배열 요소에서 첫 번째 항목(Perl에서는 0번째)을 저장하고 두 개의 필드만 있는 행을 감지하고 두 번째 필드 => 값을 해시 %h의 첫 번째 필드로 저장합니다. 정규식에서 얻은 일치 항목을 반전하여 이를 얻습니다. 그런 다음 인쇄합니다.
$ perl -F'/^Begin.+$/m' -ln -0777 -ae'
($,, @A) = ($", qw/x1 x2 response_fn_1/);
for(@F) {
my %h = reverse /^\s*(\S+)\s+(\S+)$/mg;
print(@A),next if ! $a++;
print @h{@A};
}
' initial.log | column -t