首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在匹配后的第一个空行之前提取线

在匹配后的第一个空行之前提取线
EN

Stack Overflow用户
提问于 2017-09-08 10:12:38
回答 3查看 609关注 0票数 2

我在这个表格中有一些CSV文件:

代码语言:javascript
复制
* COMMENT
* COMMENT
100 ; 1706 ; 0.18 ; 0.45 ; 0.00015 ; 0.1485 ; 0.03 ; 1 ; 1 ; 2 ; 280 ; 100 ; 100 ; 

* COMMENT
* COMMENT

* ZT vector
0; 367; p; nan
1; 422; p; nan
2; 1; d; nan

* KS vector
0; 367; p; 236.27
1; 422; p; 236.27
2; 1; d; 236.27



*Total time: 4.04211

在匹配模式KS vector之后,我需要在空行之前提取最后一行。

更清楚的是,在上面的例子中,我想提取这条线

代码语言:javascript
复制
2; 1; d; 236.27

因为这是第一个空行之前的非空行,所以在我和KS vector匹配之后。

在匹配模式ZT vector之后,我还想使用相同的脚本提取相同类型的行,在上面的示例中,这将返回

代码语言:javascript
复制
2; 1; d; nan

我需要这样做,因为我需要该行的第一个编号,因为它告诉我KS vector之后连续的非空行数。我目前的解决办法是:

代码语言:javascript
复制
# counting number of lines after matching "KS vector" until first empty line
var=$(sed -n '/KS vector/,/^$/p' file | wc -l)
# Subtracting 2 to obtain actual number of lines
var=$(($var-2))

但是,如果可以直接提取最后一行,则可以提取第一个元素(示例中的2),并将1添加到其中以获得相同的数字。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-08 10:45:51

使用awk表达式:

代码语言:javascript
复制
awk -v vec="KS vector" '$0~vec{ f=1 }f && !NF{ print r; exit }f{ r=$0 }' file
  • vec -包含所需模式/向量的变量
  • $0~vec{ f=1 } -在遇到所需的模式/向量时-将标志f设置为活动状态
  • f{ r=$0 } -当标志f处于活动状态(在需要的向量部分下)时,将当前行捕获到variale r中。
  • f && !NF{ print r; exit } - (NF -字段总数,如果该行为空-没有字段!NF)在迭代所需的向量行时遇到空行-打印最后捕获的非空行r
  • exit -立即退出脚本执行(避免冗余操作/迭代)

产出:

代码语言:javascript
复制
2; 1; d; 236.27

如果只想打印“找到的向量”下的实际行数,请使用以下方法:

代码语言:javascript
复制
awk -v vec="KS vector" '$0~vec{ f=1 }f && !NF{ print r+1; exit }f{ r=$1 }' file
3
票数 2
EN

Stack Overflow用户

发布于 2017-09-08 15:48:15

你走错路了。您所需要的只是将awk放到段落模式中,并打印1行少于记录中的行数(因为您不希望在计数中包括KS向量行):

代码语言:javascript
复制
$ awk -v RS= -F'\n' '/KS vector/{print NF-1}' file
3

下面是awk在将记录放入段落模式(通过将RS设置为null)和以换行符分隔的字段(通过将FS设置为换行符)时对记录的看法:

代码语言:javascript
复制
$ awk -v RS= -F'\n' '/KS vector/{ for (i=1;i<=NF;i++) print NF, i, "<"$i">"}' file
4 1 <* KS vector>
4 2 <0; 367; p; 236.27>
4 3 <1; 422; p; 236.27>
4 4 <2; 1; d; 236.27>
票数 3
EN

Stack Overflow用户

发布于 2017-09-08 10:46:37

用awk:

代码语言:javascript
复制
awk '$0 ~ "KS vector" { valid=1;getline } valid==1 { cnt++;dat[cnt]=$0 } $0=="" { valid="" } END { print dat[cnt-1]  }' filename

检查与"KS向量“匹配的任何行。设置一个有效的标志,然后在下一行读取。将数据读入带有递增计数器的数组中。遇到空格时,重置有效标志。最后,打印dat数组的最后一个元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46114058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档