我具有下面文件中的数据,我想提取“测试精度”括号内的第一个值。
Intent i1
Test accuracies:
(0.90, 1.0, 0.8095238095238095, 0.8947368421052632)
Test average id : 1.0446857355e-06
Test average ood : 0.0693251593621
ood_train: 173
ood_test: 42
ood_val: 113
Intent i2
Test accuracies:
(0.92, 1.0, 0.8571428571428571, 0.923076923076923)
Test average id entropy: 8.82025156164e-06
Test average ood entropy: 0.0688835002447
ood_train: 173
ood_test: 42
ood_val: 113
Intent i3
Test accuracies:
(0.93, 1.0, 0.8095238095238095, 0.8947368421052632)
Test average id entropy: 2.35249270365e-07
Test average ood entropy: 0.0534607628718
ood_train: 173
ood_test: 42
ood_val: 113
我想在“测试精度”后出现的括号后面打印第一个条目,如下所示:
0.90
0.92
0.93
我试图使用此命令,但一步无法到达
awk -F"[()]" '{print $2}' file.txt
答案 0 :(得分:1)
对于GNU grep
,您可以使用类似PCRE的正则表达式
grep -Poz 'Test accuracies:\R\(\K\d[\d.]*' file.txt > outfile.txt
详细信息
-Poz
-P
启用PCRE regex语法,o
启用输出匹配模式,z
允许跨换行符匹配文本( Treat输入和以行序列输出数据,每行以零字节(ASCII NUL字符)而不是换行符结尾,请参见GNU grep
docs)。Test accuracies:
-文字子字符串\R
-任何换行符序列(CR,LF或CRLF)\(
-一个(
字符(必须以PCRE模式进行转义)\K
-匹配reset operator,它丢弃了到目前为止已匹配的文本\d
-一个数字[\d.]*
-0个或更多数字或.
个字符。您可以像这样使用awk
:
awk -F'[(),]' '/^Test accuracies:$/{getline; print $2; }' file.txt > outfile.txt
请参见demo online
在这里
-F'[(),]'
将字段分隔符设置为(
,)
和,
/^Test accuracies:$/
将整行与上面的Test accuracies:
文本匹配getline
将读取下一行print $2
打印字段2的内容。答案 1 :(得分:1)
pcregrep
是一个功能强大的工具,它支持不经常使用的多行匹配模式的PCRE。你可以做
pcregrep -oM 'Test accuracies:\n\(\K([^,]+)' file
答案 2 :(得分:0)
使用GNU awk:
awk -v RS='Test accuracies:\n\\(' -F, 'NR>1{print $1}' file
RS
是记录分隔符,设置为跨Test accuracies:
模式的两行和下一行括号(
匹配。
-F,
将字段分隔符设置为逗号,并允许在括号后获取第一个字段。
根据输入文件,这需要在第一条记录NR>1
之后完成。
答案 3 :(得分:0)
以下行将在您上面的示例中起作用:
awk -F "[(, )]*" '/\(/&&/\)/{print $2}'
更可靠的情况是:
awk 'n=index($0,"("){print substr($0,n+1,index($0,",")-n-1)}'
答案 4 :(得分:0)
也要捕获数据块的名称,请尝试
awk -F"[(,]" '/^Intent/ {x=$0} /^\(/ {print x "\t" $2; x=""}' file
这将返回
Intent i1 0.90
Intent i2 0.92
Intent i3 0.93