使用并排序第二列从文件中提取两列

使用并排序第二列从文件中提取两列

有一个具有以下格式的文件...

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

相关内容