【问题标题】:reading multiple lines based on an IF condition根据 IF 条件读取多行
【发布时间】:2016-04-26 22:18:04
【问题描述】:

我有一个包含这些数据的非常大的文件:

qry> /opt/ADL_db/Users/mkhalil/PipeLineWork/2-OutputPlatesTest/20150615_053914.455_0_Front.Frontview.png
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_055509.656_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_083627.005_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_054920.969_0_Front.Frontview.png       (99%)

qry> /opt/ADL_db/Users/mkhalil/PipeLineWork/2-OutputPlatesTest/20150615_054239.612_0_Front.Frontview.png
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_060212.816_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_091652.202_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_081529.893_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_061203.680_0_Front.Frontview.png       (99%


qry> /opt/ADL_db/Users/mkhalil/PipeLineWork/2-OutputPlatesTest/20150615_054241.898_0_Front.Frontview.png
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_055047.746_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_061414.016_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_054643.282_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_090622.440_0_Front.Frontview.png       (99%)
cls> /opt/ADL_db/Users/mkhalil/PipeLineWork/1-OutputPlatesReference/20150612_083110.342_0_Front.Frontview.png       (99%)

我想读的只是 qry> 行和它之后的第一行,我不知道如何使用 awk 或 sed 或 bash 来完成

【问题讨论】:

标签: bash awk sed


【解决方案1】:

您可以使用带有-A 标志的GNU grep 来获取该行及其后的行

grep -A1 'qry>' <filename>

它将匹配包含qry&gt; 的行,-A 标志将告诉它在匹配后也抓取 1 行。

或者您可以使用sed 更符合 POSIX 标准,例如:

sed -n '/qry>/ {p;n;p;}' <filename>

这是如何工作的:

  • -n 告诉 sed 不要打印行,除非我们明确这样做
  • /qry&gt;/ 匹配包含该字符串的行
  • {p;n;p;} 打印当前行(与qry&gt; 匹配的行),转到next 行,然后也打印该行

要在纯 bash 中执行此操作,以便您可以更轻松地对线路进行操作,您可以这样做

while read -r cur; do
    if [[ "$cur" =~ 'qry>' ]]; then
        read -r result
        # Do something here with the query in $cur and the first line in $result
        printf "query line: %s\nnext line: %s\n" "$cur" "$result"
    fi
done < your_input_file

【讨论】:

  • sed 可以更简洁。 sed '/qry&gt;/!d;N' file
  • @M.Cesar 你想读什么“这个”?您是想将所有行的完整输出作为单个字符串放在变量中,还是希望变量中的每一对都单独操作?
  • 每对单独操作
  • @M.Cesar 查看我对 bash 版本的更新,该版本将为您提供可以操作的变量中的每一行
【解决方案2】:

你可以使用awk

$ awk 'BEGIN{flag=0} flag{print;flag=0} /qry>/{print;flag=1}' <filename>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2023-04-02
    • 2022-08-18
    相关资源
    最近更新 更多