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の場合、名前を変更する必要があります。このような出力を取得するにはどうすればよいですか?

4

5 に答える 5

1

while readのループでこれを行うことができますがbash、使用する方が簡単で、おそらく高速です。awk

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

ロジックprint resnames if sum >25 and sum<25は と同じであることに注意してくださいprint 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

古き良きカットはどうですか?:)

2 番目の列が必要だとします。

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

このコマンドでsedは何をしていますか? cut は、列が固定長の文字または文字列で区切られていることを想定しています (ドキュメントを参照)。

于 2012-04-29T20:24:13.007 に答える
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 に答える