我有一个这样的文本文件。
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,我必须打印重新命名。我怎样才能获得这样的输出?
答案 0 :(得分:1)
虽然您可以使用while read
中的bash
循环执行此操作,但使用awk
awk '$5 != 25 { print $1 }'
请注意,您的逻辑print resnames if sum >25 and sum<25
与print 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期望列由一个字符或一个固定长度的字符串分隔(参见文档)。