2

在当前目录中有名称格式为“gradesXXX”(其中 XXX 是课程编号)的文件,如下所示:

ID           GRADE         (this line is not contained in the files)
123456789    56
213495873    84
098342362    77
.            .
.            .
.            .

我想编写一个 BASH 脚本,打印所有等级高于某个数字的 ID,这是该脚本的第一个参数。

要求是一个 ID 最多只能打印一次,并且不使用中间文件。我被引导使用两个脚本 - 第一个长度为一行,第二个长度最多为六行(不包括“#!”行)。

我对这个很迷茫,所以任何建议都将不胜感激。干杯。

4

5 回答 5

1

我正在寻找的答案是

// internal script
#!/bin/bash
while read line; do
    line_split=( $line )
    if (( ${line_split[1]} > $1 )); then
        echo ${line_split[0]}
    fi
done

// external script
#!/bin/bash
cat grades* | sort -r -n -k 1 | internalScript $1 | cut -f1 -d" " | uniq
于 2012-10-12T11:52:31.017 回答
0

好的,一个简单的解决方案。

cat grades[0-9][0-9][0-9] | sort -nurk 2 | while read ID GRADE ; do if [ $GRADE -lt 60 ] ; then break ; fi ; echo $ID ; done | sort -u

我不确定为什么需要两个脚本。全部在一个脚本中:

#!/bin/bash

threshold=$1
cat grades[0-9][0-9][0-9] | sort -nurk 2 | while read ID GRADE ; do if [ $GRADE -lt $threshold ] ; then break ; fi ; echo $ID ; done | sort -u

我们首先对所有成绩文件进行分类,按成绩按相反顺序对它们进行排序。如果等级低于阈值,while 循环将中断,因此只有等级较高的行才能打印其 ID。sort -u确保每个 ID 只发送一次。

于 2012-10-11T08:37:15.007 回答
0

另一个解决方案:

cat grades[0-9][0-9][0-9] | awk -v MAX=70 '{ if ($2 > MAX) foo[$1]=1 }END{for (id in foo) print id }'

| sort -n如果您希望按排序顺序添加 ID,请在此之后附加。

于 2012-10-12T18:29:56.473 回答
0

您可以使用awk

awk '{ if ($2 > 70) print $1 }' grades777

它打印秒列大于 70 的每一行的第一列。如果需要更改阈值:

N=71
awk '{ if ($2 > '$N') print $1 }' grades777

这是在 AWK 中传递 shell 变量'所必需的。要处理当前目录中的所有文件并删除重复的行:grade???

awk '{ if ($2 > '$N') print $1 }' grades??? | sort -u

一个简单的单线解决方案。

于 2012-10-12T17:54:32.363 回答
0

在纯bash

N=60
for file in /path/*; do
    while read id grade; do ((grade > N)) && echo "$id"; done < "$file"
done

输出

213495873
098342362
于 2012-10-12T18:38:00.573 回答