로그 파일에서 특정 줄 추출

로그 파일에서 특정 줄 추출

아래와 같은 로그 파일이 있습니다.

 - UTT (1): test_1978_recreatie_1656.wav
lattice-to-ctm-conf ark:- output/spk001_test_1978_recreatie_1656_1bestsym.ctm 
online2-wav-nnet3-latgen-faster --online=false --do-endpointing=false --frame-subsampling-factor=3 --config=exp/tdnn1a_sp_bi_online/conf/online.conf --max-active=7000 --beam=15.0 --lattice-beam=6.0 --acoustic-scale=1.0 --word-symbol-table=exp/tdnn1a_sp_bi_online/graph_s/words.txt exp/tdnn1a_sp_bi_online/final.mdl exp/tdnn1a_sp_bi_online/graph_s/HCLG.fst 'ark:echo spk001 test_1978_recreatie_1656|' 'scp:echo test_1978_recreatie_1656 raw_data/spk001/test_1978_recreatie_1656.wav|' ark:- 
test_1978_recreatie_1656 wij zullen <unk> 
LOG (online2-wav-nnet3-latgen-faster[5.5.929~1-9bca2]:main():online2-wav-nnet3-latgen-faster.cc:296) Decoded utterance test_1978_recreatie_1656
LOG (lattice-to-ctm-conf[5.5.929~1-9bca2]:main():lattice-to-ctm-conf.cc:175) For utterance test_1978_recreatie_1656, Bayes Risk 4.06451, avg. confidence per-word 0.636305
 - UTT (1): test_1978_recreatie_1656.wav, time: 1 seconds
 - UTT (2): test_1978_recreatie_1657.wav
lattice-to-ctm-conf ark:- output/spk001_test_1978_recreatie_1657_1bestsym.ctm 
online2-wav-nnet3-latgen-faster --online=false --do-endpointing=false --frame-subsampling-factor=3 --config=exp/tdnn1a_sp_bi_online/conf/online.conf --max-active=7000 --beam=15.0 --lattice-beam=6.0 --acoustic-scale=1.0 --word-symbol-table=exp/tdnn1a_sp_bi_online/graph_s/words.txt exp/tdnn1a_sp_bi_online/final.mdl exp/tdnn1a_sp_bi_online/graph_s/HCLG.fst 'ark:echo spk001 test_1978_recreatie_1657|' 'scp:echo test_1978_recreatie_1657 raw_data/spk001/test_1978_recreatie_1657.wav|' ark:- 
test_1978_recreatie_1657 we kunnen dat wel zeggen 
LOG (online2-wav-nnet3-latgen-faster[5.5.929~1-9bca2]:main():online2-wav-nnet3-latgen-faster.cc:296) Decoded utterance test_1978_recreatie_1657
LOG (lattice-to-ctm-conf[5.5.929~1-9bca2]:main():lattice-to-ctm-conf.cc:175) For utterance test_1978_recreatie_1657, Bayes Risk 0.654865, avg. confidence per-word 0.922916
 - UTT (2): test_1978_recreatie_1657.wav, time: 0 seconds

로그 파일에는 UTT(n)의 4번째 줄마다 기록이 있으며 Linux 명령을 사용하여 이를 추출하고 싶습니다. 예를 들어 test_1978_recreatie_1657 we kunnen dat wel zeggen, test_1978_recreatie_1656 wij zullen <unk> 이전에는 특정 패턴 추출을 위해 grep 명령을 찾고 있었지만 성공하지 못했습니다. 어떻게 해야 할지 제안해 주세요.

답변1

당신이 요구하는 것은 발생 후 네 번째 줄을 인쇄하고 UTT (n)매번 카운터를 1로 재설정하는 것입니다 UTT (n).

awk '/UTT \([0-9]+\)/{line=0} {line++} line==4' file

산출

test_1978_recreatie_1656 wij zullen <unk>
test_1978_recreatie_1657 we kunnen dat wel zeggen

몇 가지 설명. 둘 중 하나가 선택사항인 awk양식 행 입니다 (둘 다는 아님). 각 입력 줄은 모든 모드/작업 명령에 순차적으로 적용됩니다. 누락 모드는 각 입력 라인에 대해 작업이 수행됨을 의미합니다. 누락은 입력 행이 인쇄됨을 의미합니다.pattern {action}patternactionaction

/UTT \([0-9]+\)/ {line=0}    # Match the pattern to set line=0
{line++}                     # Each line of input increments line
line==4                      # When line==4, implicitly print the line

답변2

이와 같은 경우 awk는 아마도 grep보다 간단할 것입니다.

awk 'c && !--c; $2 == "UTT" {c=3}' file

"UTT" 행이 일치할 때마다 카운터가 설정됩니다. 카운터가 설정된 경우 변수를 감소시키고 카운터가 0으로 돌아오면 해당 행을 인쇄합니다. 정규식 /^ - UTT/ {c=3}또는 문자열 일치 와 같은 다양한 방법으로 "UTT" 행을 일치시킬 수 있습니다 index($0, " - UTT") == 1 {c=3}. $2 == "UTT"두 번째 필드가 문자열 "UTT"인 경우 조건이 일치합니다.

답변3

사용 awk:

awk '/UTT/{a=NR+3} NR==a' input

이 명령에서는 UTTiffound a로 설정합니다 NR+3. NR==a원하는 출력을 인쇄합니다.

관련 정보