【问题标题】:How to extract specific lines from a text file using awk?如何使用 awk 从文本文件中提取特定行?
【发布时间】:2012-06-21 18:36:16
【问题描述】:

我有一个像这样的文本文件。

A   102
B   456
C   678
H    A       B        C      D       E        F      G       H       I       J
    1.18    0.20    0.23    0.05    1.89    0.72    0.11    0.49    0.31    1.45
    3.23    0.06    2.67    1.96    0.76    0.97    0.84    0.77    0.39    1.08

我需要提取所有以 B,H 开头的行和 H 之后的两行。如何使用 awk 做到这一点?

预期的输出是

 B   456
 H    A       B        C      D       E        F      G       H       I       J
    1.18    0.20    0.23    0.05    1.89    0.72    0.11    0.49    0.31    1.45
    3.23    0.06    2.67    1.96    0.76    0.97    0.84    0.77    0.39    1.08

请有任何建议。

【问题讨论】:

  • 输出中的最后两行不以 B 或 H 和开头。您的输出也有空行。请更清楚地说明您的要求。

标签: awk


【解决方案1】:

忽略输出中B 之后的空白行(您的问题规范没有说明为什么该空白行出现在输出中,所以我假设它不应该存在):

awk '/^H/{t=3} /^B/ || t-- >0' input.file

将打印所有以B 开头的行以及以H 开头的每一行以及接下来的两行。

【讨论】:

    【解决方案2】:
    awk '/^[BH]/ || /^[[:blank:]]*[[:digit:]]/' inputfile
    

    【讨论】:

    • 这很好,但仅当 H 和 B 是唯一可能表示 begin-tabular-data 的字段时才有效。它确实解决了 OP 对他/她的最佳规范的要求。
    • 这不会用数字打印最后两行
    【解决方案3】:
    bash-3.00$ cat t
    A   102
    B   456
    C   678
    H    A       B        C      D       E        F      G       H       I       J
        1.18    0.20    0.23    0.05    1.89    0.72    0.11    0.49    0.31    1.45
        3.23    0.06    2.67    1.96    0.76    0.97    0.84    0.77    0.39    1.08
    
    bash-3.00$ awk '{if(( $1 == "B") || ($1 == "H") || ($0 ~ /^ / )) print;}' t
    B   456
    H    A       B        C      D       E        F      G       H       I       J
        1.18    0.20    0.23    0.05    1.89    0.72    0.11    0.49    0.31    1.45
        3.23    0.06    2.67    1.96    0.76    0.97    0.84    0.77    0.39    1.08
    

    简而言之或

    awk '{if($0 ~ /^[BH ]/ ) print;}' t
    

    甚至更短

    awk '/^[BH ]/' t
    

    【讨论】:

      【解决方案4】:

      如果 HB 不是在表格数据之前发送的唯一标头,并且您打算省略这些数据块(您没有完全指定要求),则必须使用触发器记住您当前是否在您想要保留的区块中:

      awk '/^[^ 0-9]/ {inblock=0}; /^[BH]/ {inblock=1}; { if (inblock) print }' d.txt
      

      【讨论】:

        【解决方案5】:
        cat filename.txt | awk '/^[B(H(^ .*$){2})].*$/' > output.txt
        

        编辑:针对 OP 的编辑更新

        【讨论】:

          猜你喜欢
          • 2013-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-13
          • 1970-01-01
          相关资源
          最近更新 更多