【问题标题】:Counting the number of occurences or higher value in a file [closed]计算文件中出现的次数或更高的值[关闭]
【发布时间】:2020-10-23 23:56:11
【问题描述】:

我想知道是否有一种方法可以使用 AWK 或 SED 来查找高于您在文件中为脚本提供的参数的某些值。这就是

./script.sh CITY VALUE

在这种情况下,值是 $2 或第二个参数,它将成为我们搜索的基础,所以如果我们有一个文件,

dummy2.txt

格式:姓名;身份证;职业;邮箱;评分;访问次数;余额

John Trevolta;12334;dentist;gmail;0;0;431
Isabella;4567;dentist;gmail;0;0;400

如果我们输入,

./script.sh CITY 400

它应该能够从这个精确的 dummy2.txt 中读取每一列(在这种情况下为第七列($7))并输出它找到高于我们给它的值的次数,因此所需的输出将是:

1

但我给出的当前输出如下:

1 John Trevolta;12334;dentist;gmail;0;0;431

因此,这是我当前的代码:

#!/bin/bash
if [ "$#" -eq 0 ]
    then
        echo "Please insert arguments"
        exit 1
elif [ "$#" -lt 2 ] || [ -z "$1"  ]
    then
        echo "Error 404: No arguments found"
        exit 1
else
    grep -c "$1" dummy.txt
    awk -v  x=$2 '$7>x{ i++ }END{ print "Found:" i }' dummy2.txt
    fi

我已经添加了一些在 cmets 中找到的建议,但不幸的是,它只会打印出来,

Found:

它没有开始计算 i 甚至说它的价值。我不知道我是否需要初始化它,是否需要在其上放置 ''/""/$ 以供读取。

【问题讨论】:

  • "$7 -gt $Arg2" 不是有效的 awk 表达式...
  • 感谢您的提醒!你觉得我应该在里面放什么?
  • 类似awk -F; '$7>x' x="$var1" dummy2.txt ...
  • 很少需要从 shell 脚本调用 awk。如果你使用awk——它通常可以处理整个程序。
  • if [awk -F';' "$7 -gt $Arg2"] 包含如此多的错误假设和错误,令人难以置信。 [ 的参数应该是单个字符串,它将检查该字符串是否为空;你绝对需要在[ 和它的参数之间有一个空格;但显然字符串awk 等不是空的。 if awk -F';' -v value="$Arg2" '$7 <= value { exit 1 } END { exit 0 }' 在语法上是有意义的,但不清楚 Awk 应该读取哪个文件作为其标准输入。

标签: bash shell awk sed


【解决方案1】:

由于(缺少)输入,假设以下输入(numbers.txt):

een 1
twee 2
drie 3
vier 4
vijf 5
zes 6
zeven 7

然后:

awk -v arg1=2 '$2>arg1{ i++ }END{ print "Found " i " lines greater than " arg1 }' numbers.txt

将打印:Found 5 lines greater than 2

和:

awk -v arg1=5 '$2>arg1{ i++ }END{ print "Found " i " lines greater than " arg1 }' numbers.txt

将打印:Found 2 lines greater than 5

编辑:(因为....)

创建这样的脚本时(让我们将其命名为test.sh):

#!/bin/bash

rm numbers.txt
echo een 1 >>numbers.txt
echo twee 2 >>numbers.txt
echo drie 3 >>numbers.txt
echo vier 4 >>numbers.txt
echo vijf 5 >>numbers.txt
echo zes 6 >>numbers.txt
echo zeven 7 >>numbers.txt
echo acht 8 >>numbers.txt

awk -v arg1=3 '$2>arg1{ i++ }END{ print "Found " i " lines greater than " arg1 }' numbers.txt

awk -v arg1=5 '$2>arg1{ i++ }END{ print "Found " i " lines greater than " arg1 }' numbers.txt

awk -v arg1=$1 '$2>arg1{ i++ }END{ print "Found " i " lines greater than " arg1 }' numbers.txt

输出将是:

$ ./test.sh 7
Found 5 lines greater than 3
Found 3 lines greater than 5
Found 1 lines greater than 7

【讨论】:

  • 我试过这样做,但由于某种原因它打印了一个空白行
  • 您没有完全复制/粘贴?
  • 我稍微改了一下。 awk -v x="$2" '$7>=x {$i++ }END{print "Found:" '$i'}' dummy2.txt 它打印找到但不打印 I,不管我是否放 $ 跨度>
  • 您在哪里读到需要在 $i 周围加上单引号?
  • 把它们放上去看看会不会有什么不同,但没有
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多