使用SED或尴尬或任何命令保持每个多线匹配

  • 本文关键字:SED 任何 命令 使用 awk sed grep
  • 更新时间 :
  • 英文 :


我的模式分布在多个线上,有很多类似的模式。我需要在发现的每一个此类Mutli线模式匹配下进行进一步处理。

下面的命令是我正在尝试的一个:

cat file_with_match | grep -Pv '^$' | sed -nre '/Pure delay/I,/END OF PATH/Ip'

这给出了所有匹配。我想操纵每个过程和进一步的过程。

我的文件如下:

纯延迟路径#308,

0.003 0.003 0.032 0.003(f)0.003 AF MCLK

0.019 0.022 0.006 0.001(f)0.022 AF MCLK

路径结束

纯延迟路径#309,

0.003 0.003 0.032 0.003(f)0.003 AF MCLK

0.019 0.022 0.006 0.001(f)0.022 AF MCLK

路径结束

这只是用于解释。然后,我将需要在每个Mutli线匹配中添加所有第一列,然后将其与#id

一起打印

找不到如何处理。任何帮助都非常感谢!

gnu awk 解决方案,考虑到以下考虑:

  • ID可能会不止一次出现。所有值$ 1将被求和。
  • ID可能不会顺序,因此您可能会在中间找到一些"孔"。
  • 应按顺序打印ID。

脚本:

$ cat tst.awk
match($0, /Pure delay path #([0-9]+)/, arr){
    id=arr[1]                                          # save id
    low=(low && low<id?low:id); high=(high<id?id:high) # save lowest/highest id
    next
}
id { a[id]=a[id]+$1 }                                  # sum up $1 for id
/END OF PATH/{ id=0 }
END{
    for (i=low; i<=high; i++)
        if (i in a)                                    # check if id is defined
            printf "id: #%s sum: %*.3fn", i, length(a[i]), a[i]
}

测试数据:

$ cat input.txt
Pure delay path #333,
0.003 0.003 0.032 0.003 (F) 0.003 af mclk
123.019 0.022 0.006 0.001 (F) 0.022 af mclk
END OF PATH
Pure delay path #309,
0.003 0.003 0.032 0.003 (F) 0.003 af mclk
0.019 0.022 0.006 0.001 (F) 0.022 af mclk
END OF PATH
Pure delay path #308 ,
0.003 0.003 0.032 0.003 (F) 0.003 af mclk
0.019 0.022 0.006 0.001 (F) 0.022 af mclk
END OF PATH
Pure delay path #309,
0.003 0.003 0.032 0.003 (F) 0.003 af mclk
123.019 0.022 0.006 0.001 (F) 0.022 af mclk
END OF PATH

结果:

 $ awk -f tst.awk input.txt
 id: #308 sum: 0.022
 id: #309 sum: 123.044
 id: #333 sum: 123.022

如果您不考虑上述3个注意事项,则脚本可以更简单,因此:

$ cat tst2.awk
match($0, /Pure delay path #([0-9]+)/, arr){
    id=arr[1]
    next
}
id { a[id]=a[id]+$1 }
/END OF PATH/{
    printf "id: #%s sum: %*.3fn", id, length(a[id]), a[id]
}

这可能对您有用(gnu sed):

sed -n '/Pure delay/I{:a;N;/END OF PATH/I!ba;s/match/replace/gp}' file

使用循环:a;N;/match/!ba收集所需的线,然后以下任何内容都可以处理收集的行,即s/match/replacement/gp

n.b。最终命令应为 pP命令/标志,否则不会打印任何内容。

相关内容

最新更新