bash脚本;按行搜索表中的阈值文件并打印到文件或标准输出

bash脚本;按行搜索表中的阈值文件并打印到文件或标准输出,bash,Bash,Linux-newbe 我有一个目录,包含>100个目录,每个目录都有一个具有类似内容的文件 ------------------------------------------------------------------------------ Final Restraint Analysis for coords: md.rst Restraints, deviations, and energy contributions: pencut = -0.00 --

Linux-newbe

我有一个目录,包含>100个目录,每个目录都有一个具有类似内容的文件

------------------------------------------------------------------------------


 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但是,由于并非每一行都包含x.xxx,因此它还会返回空格和“---”。而if子句不起作用。我曾想过通过管道x通过
|printf“%.*f\n”0进行四舍五入,但这始终只能得到0。在shell中,
printf“%.*f\n”0 5.555
工作正常