Extrahieren einer bestimmten Zeile aus den Protokolldateien

Extrahieren einer bestimmten Zeile aus den Protokolldateien

Ich habe eine Protokolldatei wie unten,

 - 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

In der Protokolldatei gibt es in jeder vierten Zeile von UTT(n) eine Transkription, die ich mithilfe des Linux-Befehls extrahieren möchte. Ich habe beispielsweise test_1978_recreatie_1657 we kunnen dat wel zeggenfrüher test_1978_recreatie_1656 wij zullen <unk> nach dem Grep-Befehl zum Extrahieren bestimmter Muster gesucht, aber es hat nicht funktioniert. Bitte geben Sie mir einen Vorschlag, wie ich das machen kann.

Antwort1

Ich glaube, Sie möchten, dass die vierte Zeile nach jedem Vorkommen von gedruckt wird UTT (n)und der Zähler bei jedem Auftreten von auf 1 zurückgesetzt wird UTT (n):

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

Ausgabe

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

Einige Erklärungen. awkhat Zeilen der Form pattern {action}, wobei entweder patternoder actionoptional sind (aber nicht beide). Jede Eingabezeile wird nacheinander auf alle Muster-/Aktionsanweisungen angewendet. Ein fehlendes Muster bedeutet, dass die Aktion für jede Eingabezeile ausgeführt wird. Ein fehlendes actionbedeutet, dass die Eingabezeile gedruckt wird.

/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

Antwort2

Für so etwas ist Awk möglicherweise einfacher als grep.

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

Dies setzt einen Zähler, wenn eine „UTT“-Zeile übereinstimmt. Wenn der Zähler gesetzt ist, dekrementieren Sie die Variable und drucken Sie die Zeile, wenn der Zähler wieder auf Null zurückgeht. Sie können „UTT“-Zeilen auf verschiedene Weise abgleichen, z. B. mit einem regulären Ausdruck /^ - UTT/ {c=3}oder einer Zeichenfolgenübereinstimmung index($0, " - UTT") == 1 {c=3}. Die Bedingung $2 == "UTT"ist erfüllt, wenn das zweite Feld die Zeichenfolge „UTT“ ist.

Antwort3

Verwendung von awk:

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

Wenn in diesem Befehl UTTgefunden wird , awird auf gesetzt NR+3. NR==aDruckt die erforderliche Ausgabe.

verwandte Informationen