【问题标题】:awk to get first column if the a specific number in the line is greater than a digit如果行中的特定数字大于数字,则 awk 获取第一列
【发布时间】:2022-11-29 16:09:34
【问题描述】:

我有一个数据文件 (file.txt) 包含以下几行:

123 pro=tegs, ETA=12:00, team=xyz,user1=tom,dom=dby.com
345 pro=rbs, team=abc,user1=chan,dom=sbc.int,ETA=23:00
456 team=efg, pro=bvy,ETA=22:00,dom=sss.co.uk,user2=lis

只有当ETA= 数字大于 15 时,我才希望获得第一列 ($1),就像这里我将只有第二和第三行第一列是预期的。

345
456

我试过 cat file.txt | awk -F [,TPF=]' '{print $1}' 但它的打印整行最后有 ETA。

【问题讨论】:

    标签: shell awk


    【解决方案1】:

    我将按照以下方式利用 GNU AWK 完成此任务,让 file.txt 内容成为

    123 pro=tegs, ETA=12:00, team=xyz,user1=tom,dom=dby.com
    345 pro=rbs, team=abc,user1=chan,dom=sbc.int,ETA=23:00
    456 team=efg, pro=bvy,ETA=02:00,dom=sss.co.uk,user2=lis
    

    然后

    awk 'substr($0,index($0,"ETA=")+4,2)+0>15{print $1}' file.txt
    

    给出输出

    345
    

    说明:我使用String functionsindex找到ETA=在哪里,然后substrETA=之后得到2个字符,4被用作ETA=是4个字符长,index给出了起始位置,我使用 +0 转换为整数,然后将其与 15 进行比较。免责声明:此解决方案假定每一行都有 ETA= 后跟恰好 2 位数字。

    (在 GNU Awk 5.0.1 中测试)

    【讨论】:

      【解决方案2】:

      目前还不清楚为什么你认为你的尝试会做任何类似的事情。您的尝试使用了完全不同的字段分隔符,并且没有将任何内容与数字 15 进行比较。

      您还需要删除 useless use of cat

      当您使用 -F 指定列分隔符时,会更改第一列 $1 的实际含义;然后是第一次出现分隔符之前的所有内容。大概是分别split那一行获取第一列,空格分隔。

      awk -F 'ETA=' '$2 > 15 { split($0, n, /[ 	]+/); print n[1] }' file.txt
      

      $2 中的值将是第一个分隔符之后的数据(一直到下一个分隔符),但在数字比较中使用它只会忽略字段开头数字之后的任何非数字文本。因此,例如,在第一行,我们实际上是在检查 12:00, team=xyz,user1=tom,dom=dby.com 是否大于 15,但它有效地检查 12 是否大于 15(这显然是错误的)。

      当条件为真时,我们将原始行 $0 分成空白序列的数组 n ,然后打印该数组的第一个元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        • 2014-06-24
        • 2016-05-29
        • 2019-05-15
        • 1970-01-01
        相关资源
        最近更新 更多