有一个具有以下格式的文件...
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