Eu tenho um arquivo de log como abaixo,
- 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
No arquivo de log, a cada 4ª linha do UTT(n) há uma transcrição, que desejo extrair usando o comando Linux. Por exemplo test_1978_recreatie_1657 we kunnen dat wel zeggen
, test_1978_recreatie_1656 wij zullen <unk>
anteriormente eu estava procurando o comando grep para extração de padrões específicos, mas não funcionou. Por favor, sugira como posso fazer isso.
Responder1
Acho que o que você está pedindo é imprimir a quarta linha após qualquer ocorrência de UTT (n)
, zerando o contador para 1 cada vez que encontrar UTT (n)
:
awk '/UTT \([0-9]+\)/{line=0} {line++} line==4' file
Saída
test_1978_recreatie_1656 wij zullen <unk>
test_1978_recreatie_1657 we kunnen dat wel zeggen
Alguma explicação. awk
possui linhas no formato pattern {action}
, onde pattern
ou action
são opcionais (mas não ambos). Cada linha de entrada é aplicada a todas as instruções de padrão/ação em sequência. Um padrão ausente implica que a ação será executada para cada linha de entrada. Uma falta action
implica que a linha de entrada será impressa.
/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
Responder2
Awk pode ser mais simples que grep para algo assim.
awk 'c && !--c; $2 == "UTT" {c=3}' file
Isso define um contador sempre que uma linha "UTT" corresponde. Se o contador estiver definido, diminua a variável e imprima a linha se o contador voltar a zero. Você pode combinar linhas "UTT" de várias maneiras, por exemplo, uma regex /^ - UTT/ {c=3}
ou uma correspondência de string index($0, " - UTT") == 1 {c=3}
. A condição $2 == "UTT"
corresponde quando o segundo campo é a string "UTT".
Responder3
Usando awk
:
awk '/UTT/{a=NR+3} NR==a' input
Neste comando, se UTT
for encontrado, a
será definido como NR+3
. NR==a
imprime a saída necessária.