以下の形式のファイルがあります。
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
デフォルトでは、-E
xtended regex -n
otは行を印刷するために使用され、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
数字をソートします。
-k
2