在当前目录中,有些文件的名称为“gradesXXX”(其中XXX是课程编号),如下所示:
ID GRADE (this line is not contained in the files)
123456789 56
213495873 84
098342362 77
. .
. .
. .
我想编写一个BASH脚本,打印所有等级高于某个数字的ID,该ID作为该脚本的第一个参数。
要求是ID必须最多打印一次,并且不使用任何中间文件。 我被引导使用两个脚本 - 第一个长度为一行,第二个长度最多为六行(不包括“#!”行)。
我很遗憾这个,所以任何建议都将不胜感激。 干杯。
答案 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