【问题标题】:How can I check if a field is greater than a certain number if that field has a $ sign in front?如果该字段前面有 $ 符号,我如何检查该字段是否大于某个数字?
【发布时间】:2017-12-28 00:36:06
【问题描述】:

给定一个名为employee.txt 的文件,格式为(名、姓、薪),空格作为字段分隔符:

Foo Bar $1,000
First Last $5,550
Abc Def $3,000
Stack Overflow $6000
Help Please $4700

我想打印第三个字段大于 $4,000 的行。期望的输出:

First Last $5,550
Stack Overflow $6000
Help Please $4700

我不确定如何检查字段是否大于 4000,例如,其中包含 $,

我尝试使用sed$, 替换为空白,然后重定向到awk,但我希望输出包含$,,就像原来的一样。

这对awk 可行吗?

【问题讨论】:

    标签: bash awk


    【解决方案1】:
    $ awk '{v=$3; gsub(/[$,]/, "", v)} v+0>4000' employee.txt 
    First Last $5,550
    Stack Overflow $6000
    Help Please $4700
    

    工作原理

    1. v=$3

      将第三个字段保存为变量v

    2. gsub(/[$,]/, "", v)

      v中删除有问题的字符,

    3. v+0>4000

      打印v 大于 4000 的行。

    打印一系列值

    要打印值大于 4000 且小于 5000 的所有行:

    $ awk '{v=$3; gsub(/[$,]/, "", v)} v+0>4000 && v+0<5000' employee.txt 
    Help Please $4700
    

    【讨论】:

    • 是否也可以做4000到5000的范围?
    • @5areductase 是的。有关如何打印范围,请参阅更新的答案。
    • 这是在进行字符串比较!它为v&gt;4000000 输出相同的结果。
    • @Pesa 好的。固定的。使用 v+0>4000 强制进行数字比较。
    【解决方案2】:

    为了多样化,这是一个仅使用 bash 的解决方案(明显与此处的 awk 解决方案相比,大数据速度较慢):

    while IFS=' ' read -r first last cash; do
        valid_cash=${cash//[$,]/}
        (( valid_cash > 4000 )) && echo "$first $last $cash"
    done < employee.txt
    

    【讨论】:

      【解决方案3】:
      awk 'gensub(/[$,]/,"","g",$NF) > 4000' input_file
      

      (g)awk 的默认动作是打印

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        相关资源
        最近更新 更多