2番目の列を使用してソートして、ファイルから2つの列を抽出します。

2番目の列を使用してソートして、ファイルから2つの列を抽出します。

以下の形式のファイルがあります。

ATOM    126  CD  GLN A 449      -2.853  11.592 119.709  1.00 17.95           C  
ATOM    127  OE1 GLN A 449      -4.056  11.297 119.695  1.00 20.83           O  
ATOM    128  NE2 GLN A 449      -1.948  10.876 120.359  1.00 14.98           N  
HETATM  129  N   MSE A 450      -4.523  16.830 119.280  1.00 14.88           N  
HETATM  130  CA  MSE A 450      -5.537  17.804 118.911  1.00 15.65           C  

ファイルには、最初の列に異なる名前を持つ数百の行があります。 ATOMという行(最初の列)とATOMの11番目の列の値を抽出したいと思います。次に、値を並べ替えます(最も小さいものから最大のものまで)。 grep、awk、sedなどを使用してこれを行い、.txtファイルに出力するにはどうすればよいですか?

答え1

awk '$1=="ATOM"{print $11}' file | sort -n > foo.txt

または:

awk '$1=="ATOM"{print $1, $11}' file | sort -k2,2n > foo.txt

ATOMを出力に含めるかどうかによって異なります。

答え2

これは間違いなく良い方法ですが、入れ子になったawkキャプチャグループを使用する代替方法は次のとおりです。

sed -En "s/^(^ATOM)(( +)([^ ]+)){10}.*/\1 \4/p" file | sort -n
ATOM 14.98
ATOM 17.95
ATOM 20.83

sed -En "s/(^ATOM)(( +)([^ ]+)){10}.*/\4/p" file | sort -n
14.98
17.95
20.83

sedデフォルトでは、-Extended regex -notは行を印刷するために使用され、s/代わりに次のものを使用します。

  • \1最初のキャプチャです(^ATOM)^行の先頭に固定され、最初のフィールドです)。
  • \2はい{10}、繰り返し続けます(( +)([^ ]+))
  • \3( +)本質的に繰り返し
  • \4([^ ]+)同じ繰り返し(11番目のフィールド)で欲しいものです。
  • 最後のものをキャッチする必要はありません.*

その後、キャプチャされたグループの出力が再組み立てまたは調整され、/\1 \4/正常/\4/p置き換えられたすべてのラインが印刷されます。

答え3

文字列操作を使用して、文字列から不要なスペースを削除できます。これにより、使用可能な区切り文字cut -d(スペースまたはタブ)が残ります。

var="$(cat input.txt)"

echo "${var//+( )/$'\t'}" | cut -f1,11 | sort -nk2 > output.txt

//
+( )一致するスペースタブ
$'\t'文字のすべての項目を置き換える

cut -f出力フィールドは、単語で始まる1,11
sort -n数字をソートします。
-k2

関連情報