如何获得括号中的第一个元素

时间:2018-11-09 08:17:16

标签: awk sed

我具有下面文件中的数据,我想提取“测试精度”括号内的第一个值。

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

5 个答案:

答案 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