로그 파일에서 특정 행 추출

로그 파일에서 특정 행 추출

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

 - 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}. 여기서 pattern또는 중 하나 action는 선택 사항입니다(둘 다는 아님). 각 입력 줄은 모든 패턴/작업 명령에 순차적으로 적용됩니다. 누락된 패턴은 모든 입력 줄에 대해 작업이 실행된다는 것을 의미합니다. 누락은 action입력 행이 인쇄된다는 것을 의미합니다.

/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

이 명령에서 가 UTT발견되면 로 a설정됩니다 NR+3. NR==a필요한 출력을 인쇄합니다.

관련 정보