단일 패스로 파일에서 여러 값을 추출하는 방법은 무엇입니까?

단일 패스로 파일에서 여러 값을 추출하는 방법은 무엇입니까?

나는 거대한 시뮬레이션 로그 파일(약 6GB)을 가지고 있습니다. 이 파일에 있는 수백만 줄 중 특정 시간에 자주 반복되는 두 줄이 있습니다.

...
Max value of omega = 3.0355
Time = 0.000001
....
Max value of omega = 4.3644
Time = 0.000013
...
Max value of omega = 3.7319
Time = 0.000025
...
...
...
Max value of omega = 7.0695
Time = 1.32125
...
... etc.

"오메가의 최대값"과 "시간"을 추출하여 단일 파일의 열로 저장하고 싶습니다.

#time max_omega
0.000001 3.0355
0.000013 4.3644
0.000025 3.7319
...etc.

나는 다음과 같이 진행합니다 :

# The following takes about 15 seconds
grep -F 'Max value of omega' logfile | cut -d "=" -f 2 > max_omega_file.txt  

, "시간"도 마찬가지입니다

# This also takes about 15 seconds
# Very important: match exactly 'Time =' because there other lines that contain the word 'Time'
grep -F 'Time =' logfile | cut -d "=" -f 2 > time.txt

그런 다음 이 명령을 사용하여 두 개의 열 파일을 생성해야 합니다 paste. 첫 번째 열은 Time.txt이고 두 번째 열은 "max_omega_file.txt"입니다.

보시다시피 위의 단계는 두 배의 시간이 걸립니다. 한 번에 동일한 결과를 달성하여 시간을 절약할 수 있는 솔루션이 있는지 궁금합니다.

답변1

sed -n '/^Max/ { s/^.*=\s*//;h; };
        /^Time/{ s/^.*=\s*//;G; s/\n/ /;p; }' infile
  • 일치 실행 구문 /.../{ ... }:
    여기에 포함된 명령은 {...}정규식/패턴과 일치하는 줄에서만 실행됩니다 /.../.

  • s/^.*=\s*//: 끝 부분과 공백 (있는 경우)
    까지 모두 제거합니다 .=\s*

  • h:
    결과를 예약된 공간에 복사합니다.

  • G:
    개행 문자가 포함된 패턴 공간에 예약된 공간을 추가합니다.

  • s/\n/ /:
    포함된 개행 문자를 패턴 공간의 공백으로 대체합니다.

  • p:
    패턴 공간을 인쇄합니다. P여기서 명령을 사용할 수도 있습니다.

    0.000001 3.0355
    0.000013 4.3644
    0.000025 3.7319
    1.32125 7.0695
    

유사한 방법 제안@stevesliwa이것은 s//<replace>/마지막 게임에서 교체를 수행하는 것을 간략하게 표현한 것입니다:

sed -n '/^Max.*=\s*/ { s///;h; };
        /^Time.*=\s*/{ s///;G; s/\n/ /;p; }' infile

답변2

더 빨라질 것이라고 약속할 수는 없지만 awk에서 다음과 같은 작업을 수행할 수 있습니다.

awk -F' = ' '$1=="Max value of omega" {omega = $2} $1=="Time" {print omega,$2}' file

답변3

$ awk 'BEGIN{print "#time", "omega"} /^Max value of omega =/{omega=$NF; next} /^Time =/{print $NF, omega}' file
#time omega
0.000001 3.0355
0.000013 4.3644
0.000025 3.7319
1.32125 7.0695

그러나 이것이 더 빠를 수도 있습니다.

$ grep -E '^(Max value of omega|Time) =' file |
    awk 'BEGIN{print "#time", "omega"} NR%2{omega=$NF; next} {print $NF, omega}'
#time omega
0.000001 3.0355
0.000013 4.3644
0.000025 3.7319
1.32125 7.0695

답변4

grep여러 패턴을 한번에 검색할 수 있습니다

-e PATTERNS, --regexp=PATTERNS
PATTERNS를 패턴으로 사용합니다. 이 옵션을 여러 번 사용하는 경우또는 -f(--file) 옵션과 결합됩니다.주어진 모든 패턴을 검색. 이 옵션은 "-"로 시작하는 패턴을 보호하는 데 사용할 수 있습니다.

그래서

grep -F -e 'Max value of omega = ' -e 'Time = ' logfile

그러면 검색 공간의 크기가 줄어들고 다른 제안 중 하나로 프로세스를 게시할 수 있습니다.

관련 정보