【问题标题】:Combine if and NR in awk在 awk 中结合 if 和 NR
【发布时间】:2015-10-18 19:19:23
【问题描述】:

在过去的几个小时里,我一直试图用 awk 来解决这个愚蠢的事情,但到目前为止还没有运气。 我了解如何绘制每隔一行,例如:

awk 'NR%2' file

如果一列在特定范围内,我也了解如何打印基于列的文件,例如:

awk '{if ($1 > 'yourvalue') print}' file

我不太明白如何将两者结合起来。 在实践中,如果我有一个文件组织为:

1 3 6 8
2 8 4 5
3 9 8 7
4 7 3 5
5 7 3 6
6 2 4 6
7 1 4 7
8 3 2 1
9 7 5 3
10 4 5 6
11 8 2 5

如何获取,例如:

1 3 6 8
3 9 8 7
5 7 3 6
7 1 4 7
8 3 2 1
9 7 5 3
10 4 5 6
11 8 2 5

如果第 1 列小于 7,则每两行返回一次,其余部分正常打印。 我试图将所有内容组合在一行中,但总是出错。

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    您可以反转第二个条件并使用 OR 条件来组合它们:

    awk 'NR%2 || $1>=7' file
    1 3 6 8
    3 9 8 7
    5 7 3 6
    7 1 4 7
    8 3 2 1
    9 7 5 3
    10 4 5 6
    11 8 2 5
    

    【讨论】:

    • 这似乎可行,但如果我想打印一行并删除以下两行会发生什么?例如:1 3 6 8- 4 7 3 5- 7 1 4 7- 8 3 2 1- 9 7 5 3- 10 4 5 6- 11 8 2 5-
    • 嗯,这似乎是一个不同的问题,不是吗?您应该编辑问题以显示输入和预期输出。
    【解决方案2】:

    您可以使用&&(和)和||(或)组合条件。 您可以将括号用于嵌套条件。 例如:

    awk 'cond1 && (cond2 || cond3)' file
    

    这个:

    awk '{if ($1 > 7) print}' file
    

    ...等价于:

    awk '$1 > 7 { print }' file
    

    ...因为您可以在{...} 之外编写条件以用作过滤器

    ...相当于:

    awk '$1 > 7' file
    

    ...因为默认操作是打印。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-21
      • 2022-01-21
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      相关资源
      最近更新 更多