1

我有一个这样的文本文件。

 res          ABS   sum     
 SER A   1   161.15 138.3  
 CYS A   2    66.65  49.6  
 PRO A   3    21.48  15.8  
 ALA A   4    77.68  72.0  
 ILE A   5    15.70   9.0  
 HIS A   6    10.88   5.9 

我想根据最后一列(总和)的值提取第一列(res)的名称。如果 sum >25 和 sum<25,我必须打印 resnames。我怎样才能得到这样的输出?

4

5 回答 5

1

虽然您可以使用while read循环来执行此操作bash,但使用起来更容易,而且很可能更快awk

awk '$5 != 25 { print $1 }'

请注意,您的逻辑print resnames if sum >25 and sum<25print if sum != 25.

于 2012-04-28T13:47:46.893 回答
1

这应该这样做:

awk 'BEGIN{FS=OFS=" "}{if($5 != 25) print $1}' bla.txt
于 2012-04-28T13:48:54.663 回答
1

考虑使用awk. 它是处理文本列(以及更多)的简单工具。这是一个简单的awk 教程,它将为您提供概述。如果您想在 bash 脚本中使用它,那么教程应该会有所帮助。

在命令行上运行它,让您了解如何做到这一点:

> echo "SER A   1   161.15 138.3" | awk '{ if($5 > 25) print $1}'
> SER
> echo "SER A   1   161.15 138.3" | awk '{ if($5 > 140) print $1}'
> 
于 2012-04-28T13:49:44.123 回答
0
while read line
do 
v=($line)
sum=${v[4]}
((${sum/.*/} >= 25)) && echo ${v[0]}
done < file

您需要跳过第一行。

由于 bash 不处理浮点值,这将打印 25,它并不完全大于 25。

这可以通过调用 bc 来处理算术。

tail -n +2 ser.dat | while read line
do  
  v=($line)
  sum=${v[4]}
  gt=$(echo "$sum > 25" | bc) && echo ${v[0]}
done
于 2012-04-28T14:02:36.890 回答
0

好的旧剪裁呢?:)

说你想要第二列,

cat your_file.txt | sed 's, +, ,g' | cut -d" " -f 2

sed 在这个命令中做了什么?cut 期望列由一个字符或一个固定长度的字符串分隔(参见文档)。

于 2012-04-29T20:24:13.007 回答