파일에서 일치하는 정수를 수집하고 저장합니다.

파일에서 일치하는 정수를 수집하고 저장합니다.

다음을 포함하는 결과 파일이 있습니다.

==============================================
------------------------------
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_1testx1x2

sed -n '/평가 매개변수/{n;p;n;p}'initial.log

합계 가 표 형식이 test되도록 행의 정수를 출력 파일로 어떻게 전송할 수 있습니까 ?x1x2

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

관련 정보