BASH脚本 - 从目录中的所有文件打印排序内容,没有代表

时间:2012-10-11 08:30:34

标签: bash sorting printing

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

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

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

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

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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只发送一次。

答案 2 :(得分:0)

您可以使用awk

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

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

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

pass shell variables in AWK需要'。要使用当前目录中的所有grade???个文件并删除重复的行:

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

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

答案 3 :(得分: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 }'

如果您想要按排序顺序排列ID,请在此之后附加| sort -n

答案 4 :(得分:0)

纯粹bash

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

<强>输出

213495873
098342362