我在这个表格中有一些CSV文件:
* 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之后,我需要在空行之前提取最后一行。
更清楚的是,在上面的例子中,我想提取这条线
2; 1; d; 236.27因为这是第一个空行之前的非空行,所以在我和KS vector匹配之后。
在匹配模式ZT vector之后,我还想使用相同的脚本提取相同类型的行,在上面的示例中,这将返回
2; 1; d; nan我需要这样做,因为我需要该行的第一个编号,因为它告诉我KS vector之后连续的非空行数。我目前的解决办法是:
# 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添加到其中以获得相同的数字。
发布于 2017-09-08 10:45:51
使用awk表达式:
awk -v vec="KS vector" '$0~vec{ f=1 }f && !NF{ print r; exit }f{ r=$0 }' filevec -包含所需模式/向量的变量$0~vec{ f=1 } -在遇到所需的模式/向量时-将标志f设置为活动状态f{ r=$0 } -当标志f处于活动状态(在需要的向量部分下)时,将当前行捕获到variale r中。f && !NF{ print r; exit } - (NF -字段总数,如果该行为空-没有字段!NF)在迭代所需的向量行时遇到空行-打印最后捕获的非空行rexit -立即退出脚本执行(避免冗余操作/迭代)产出:
2; 1; d; 236.27如果只想打印“找到的向量”下的实际行数,请使用以下方法:
awk -v vec="KS vector" '$0~vec{ f=1 }f && !NF{ print r+1; exit }f{ r=$1 }' file
3发布于 2017-09-08 15:48:15
你走错路了。您所需要的只是将awk放到段落模式中,并打印1行少于记录中的行数(因为您不希望在计数中包括KS向量行):
$ awk -v RS= -F'\n' '/KS vector/{print NF-1}' file
3下面是awk在将记录放入段落模式(通过将RS设置为null)和以换行符分隔的字段(通过将FS设置为换行符)时对记录的看法:
$ 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>发布于 2017-09-08 10:46:37
用awk:
awk '$0 ~ "KS vector" { valid=1;getline } valid==1 { cnt++;dat[cnt]=$0 } $0=="" { valid="" } END { print dat[cnt-1] }' filename检查与"KS向量“匹配的任何行。设置一个有效的标志,然后在下一行读取。将数据读入带有递增计数器的数组中。遇到空格时,重置有效标志。最后,打印dat数组的最后一个元素。
https://stackoverflow.com/questions/46114058
复制相似问题