bash脚本;按行搜索表中的阈值文件并打印到文件或标准输出
Linux-newbe 我有一个目录,包含>100个目录,每个目录都有一个具有类似内容的文件bash脚本;按行搜索表中的阈值文件并打印到文件或标准输出,bash,Bash,Linux-newbe 我有一个目录,包含>100个目录,每个目录都有一个具有类似内容的文件 ------------------------------------------------------------------------------ Final Restraint Analysis for coords: md.rst Restraints, deviations, and energy contributions: pencut = -0.00 --
------------------------------------------------------------------------------
Final Restraint Analysis for coords: md.rst
Restraints, deviations, and energy contributions: pencut = -0.00
------------------------------------------------------------------------------
First atom Last atom curr. value target deviation penalty
------------------------------------------------------------------------------
*H43 BOC 1 -- H ALA 2: 4.506 4.760 0.000 0.000 d 0: 0
在这些文件中,有与上一行类似的行。我需要在每一行搜索一个阈值的列惩罚,如果它大于这一行,则应打印到标准输出或文件中。
我开始使用cut,但在使用分隔符时遇到了困难,即使我剪切了正确的coulmn,我也不知道如何保存行号并将这一行打印到文件或标准输出
感谢您的帮助在大量帮助下,我终于找到了一个解决方案:
#! /bin/bash
cutoff=5.0
for i in sim_results_rep*; do
while read -r LINE; do
echo $LINE | grep 'First atom' > /dev/null
if [ $? -ne 0 ]
then
continue
else
read -r LINE
while true; do
read -r LINE
echo $LINE | grep 'Total distance penalty' > /dev/null
if [ $? -ne 0 ]
then
x=`echo "$LINE" | awk '{print $11}'`
if [ `echo "$x > $cutoff" | bc` == 1 ]
then
echo "In file $i, the follwing distance has a penalty higher than $cutoff"
echo $LINE
else
continue
fi
else
break
fi
done
break
fi
done < $i/*.nmrout
done
#/bin/bash
截止值=5.0
对于模拟结果中的i;做
而read-r行;做
echo$LINE | grep'First atom'>/dev/null
如果[$?-ne 0]
然后
继续
其他的
read-r行
虽然真实;做
read-r行
echo$LINE | grep‘总距离惩罚’>/dev/null
如果[$?-ne 0]
然后
x=`echo“$LINE”| awk'{print$11}`
如果[`echo“$x>$cutoff”|bc`==1]
然后
echo“在文件$i中,跟随距离的惩罚高于$cutoff”
回音$线
其他的
继续
fi
其他的
打破
fi
完成
打破
fi
完成<$i/*.nmrout
完成
是否可以将文件格式更改为csv?如果列由多个空格分隔,这是否有效cat您的_文件| tr-s“”、|cut-d“、“-f 12
对于上面的示例文件,我可以想象通过cat-n
来获得行号。然后通过sed
将多行空格和制表符转换为单个空格。然后通过管道将其输送到cut
中,以拉出您要查找的行号和值。cat您的_文件| tr-s''、'|cut-d'、“-f 12 | sed'/^\s*$/d'
目前为止工作正常,并将文件限制在需要检查阈值的值列中。同时cat-n
工作并添加行号。但是我不知道如何把这些东西结合起来。因此,如何逐行打印出带有此“值<阈值”作为参数的行我可能已经找到了一种解决方法,但对于文件夹中的i,它仍然不是100%有效的;读行时执行
;do
x=echo“$line”| tr-s”、“| cut-d”、“-f 11
如果$x>5,则echo“$line”;fi done|printf“%.*f\n”0进行四舍五入,但这始终只能得到0。在shell中,printf“%.*f\n”0 5.555
工作正常