【问题标题】:AWK Matching Positive and Negative NumbersAWK 匹配正数和负数
【发布时间】:2010-10-14 21:27:54
【问题描述】:

我的数据如下所示:

-1033  
-  
222
100
-30
-
10

我想要做的是捕获除“仅破折号”条目之外的所有数字。

为什么我下面的 awk 失败了?

 awk '$4 != "-" {print $4}'

【问题讨论】:

  • 适用于我,使用 GNU awk。你确定你指的是正确的领域吗? ($4)
  • 也这么想。看起来很可疑
  • 我认为 awk '!/-/' 也可以。我读到它与 awk '!($0 ~ "-")' 相同,但我不完全确定。

标签: regex unix awk


【解决方案1】:

你的awk 脚本说

如果第四个字段不是破折号,打印出来

但是,如果该行不是破折号,您希望将其打印出来

awk '$0 != "-"'

默认操作是打印,因此不需要正文。

如果你想打印一组数字,如果你使用 gawk,你可以使用 GNU awk 扩展。它允许使用正则表达式拆分记录:

gawk 'BEGIN { RS="(^|\n)-($|\n)" } { print "Numbers:\n" $0 }'

现在,不是行,而是一组数字,由仅包含- 的行分隔。将字段分隔符 (FS) 设置为换行符可以让您遍历此类组中的数字:

gawk 'BEGIN { FS="\n"; RS="(^|\n)-($|\n)" } 
      { print "Numbers:"; for(i=1;i<=NF;i++) print " *: " $i }'

但是我同意其他答案。如果您只想过滤掉与某些文本匹配的行,grep 是更好的工具。

【讨论】:

    【解决方案2】:

    你为什么要查看$4?看来您应该检查 $1$0,就像 litb 所说的那样。

    但是 awk 是完成这项工作的重量级工具。试试

    grep -v '^-$'
    

    删除仅包含破折号或的行

    grep -v '^ *- *$'
    

    删除仅包含破折号和可能包含一些空格字符的行。

    【讨论】:

    • 该文件实际上可能是一个多列文件,其相关值在第 4 列。这是我的阅读。例如,每行包含日期、股票、美元价值和数量的股票交易文件,您只对实际数量感兴趣。 (续...)
    • ... 资本回报之类的事情会涉及购买价格的变化,而不是数量的变化。
    • 可能是,但在那种情况下为什么会失败?打败我。
    【解决方案3】:

    假设您的数据文件实际上是多列的,并且值在第 4 列中,以下将起作用:

    awk '$4 != "-" {print $4} {}'
    

    它只打印不是“-”的值。您的版本可能会打印该值(或两次),因为默认操作是打印。添加{} 会使默认操作“什么也不做”。

    如果数据实际上如图所示(仅一列),您应该使用 $1 而不是 $4 - 我不会使用 $0,因为那是整行,而且您似乎在前两行的结尾会导致$0 成为"-1033 ""- "

    但是,如果它是单列,我根本不会使用 awk,而是:

    grep -v '^-$'
    grep -v '^ *- *$'
    

    第二个允许"-" 字符两侧的空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2019-09-22
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      相关资源
      最近更新 更多