代码之家  ›  专栏  ›  技术社区  ›  jackscorrow

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

  •  2
  • jackscorrow  · 技术社区  · 7 年前

    我有一些以下形式的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矢量

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

    2; 1; d; nan
    

    我需要这样做,因为我需要该行的第一个数字,因为它告诉我后面连续的非空行的数量 KS矢量 .

    # 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以获得相同的数字。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Ed Morton    7 年前

    你这样做是不对的。您只需将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>
    
        2
  •  2
  •   RomanPerekhrest    7 年前

    具有 表达式:

    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 处于活动状态(在所需的矢量部分下)-将当前线路捕捉到变量中 r

    • f && !NF{ print r; exit } NF -字段总数,如果行为空-没有字段 !NF

    • exit -立即退出脚本执行(避免冗余操作/迭代)

    输出:

    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
    
        3
  •  0
  •   Raman Sailopal    7 年前

    带awk:

    awk '$0 ~ "KS vector" { valid=1;getline } valid==1 { cnt++;dat[cnt]=$0 } $0=="" { valid="" } END { print dat[cnt-1]  }' filename