我有一个如下所示的日志文件,
- 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”行匹配时,就会设置一个计数器。如果设置了计数器,则递减变量并在计数器返回零时打印该行。您可以通过多种方式匹配“UTT”行,例如 regex/^ - UTT/ {c=3}
或 string match 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
打印所需的输出。