在我的项目中,jobinfo.txt的内容为:
3124631 nsgk138_LZH 48
3123498 nscc1697_ZJK 48
3115687 nsgg135_MJ 48
3123919 nscc1564_ZZG 840
3115689 nsgg135_MJ 48
3115690 nsgg135_MJ 48
3122716 nscc128_ZW 24
3122720 nscc128_ZW 24
3123868 nsgg038_PM 24
3122726 nscc128_ZW 24
我想找到第3列的最大值,所以我写了一个bb.sh,内容如下:
sendzabbixnum=`awk '{print $3}' jobinfo.txt | sort -n | uniq | tail -1`
echo $sendzabbixnum
awk '{if($3==$sendzabbixnum) print $0}' jobinfo.txt >> maxscalejobinfo.txt
它可以在我的终端屏幕上成功显示840,但是在maxscalejobinfo.txt中什么都没有。
我可以在命令行中这样使用:
awk '{if($3==840) print $0}' jobinfo.txt
并获得正确的结果:
3123919 nscc1564_ZZG 840
我已经尝试过bb.sh:
awk '{if($3=="$sendzabbixnum") print $0}' jobinfo.txt >> maxscalejobinfo.txt
但是又失败了
我在bb.sh中尝试了另一种方法:
awk '{if($3==840) print $0}' jobinfo.txt >> maxscalejobinfo.txt
效果很好
bb.sh脚本有什么问题?谁可以帮助我?
答案 0 :(得分:3)
为此只需使用一个awk,而不是shell + awk:
awk '$NF > max {max=$NF; r=$0} END{print r > "maxscalejobinfo.txt"}' jobinfo.txt
还要使用以下命令确保jobinfo.txt
的DOS行结尾:
cat -A jobinfo.txt
如果在每行末尾都记下^M
,则首先使用dos2unix
或sed
或tr
将该文件转换为Unix文件
答案 1 :(得分:1)
您可以使用sort命令并将输出重定向到maxscalejobinfo.txt
$ cat jobinfo.txt
3124631 nsgk138_LZH 48
3123498 nscc1697_ZJK 48
3115687 nsgg135_MJ 48
3123919 nscc1564_ZZG 840
3115689 nsgg135_MJ 48
3115690 nsgg135_MJ 48
3122716 nscc128_ZW 24
3122720 nscc128_ZW 24
3123868 nsgg038_PM 24
3122726 nscc128_ZW 24
$ sort -k3 -nr jobinfo.txt | head -n 1
3123919 nscc1564_ZZG 840
由于它类似于SQL,因此您也可以使用sqlite进行
$ cat ./sqllite_longline.sh
#!/bin/sh
sqlite3 << EOF
create table t1(a,b,c);
.separator ' '
.import $1 t1
select * from t1 where t1.c=(select max(c) from t1)
EOF
$ ./sqllite_longline.sh jobinfo.txt
3123919 nscc1564_ZZG 840