나는 거대한 시뮬레이션 로그 파일(약 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
그러면 검색 공간의 크기가 줄어들고 다른 제안 중 하나로 프로세스를 게시할 수 있습니다.