如何使用bash从文本文件中提取列

时间:2012-04-28 13:35:28

标签: linux bash4

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

 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 

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

5 个答案:

答案 0 :(得分:1)

虽然您可以使用while read中的bash循环执行此操作,但使用awk

更容易,也更快捷
awk '$5 != 25 { print $1 }'

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

答案 1 :(得分:1)

这应该这样做:

awk 'BEGIN{FS=OFS=" "}{if($5 != 25) print $1}' bla.txt

答案 2 :(得分:1)

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

在命令行上运行此命令,以便了解如何执行此操作:

> 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}'
> 

答案 3 :(得分:0)

while read line
do 
v=($line)
sum=${v[4]}
((${sum/.*/} >= 25)) && echo ${v[0]}
done < file

您需要跳过第一行。

由于bash不处理浮点值,因此将打印25,这不会大于25。

这可以通过调用bc for arithmetics来处理。

tail -n +2 ser.dat | while read line
do  
  v=($line)
  sum=${v[4]}
  gt=$(echo "$sum > 25" | bc) && echo ${v[0]}
done

答案 4 :(得分:0)

好的旧切口怎么样? :)

说你想要第二列,

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

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