当我使用 bash 并且我想剪切我知道在哪一行的文本文件的一部分时,我使用这样的东西:
X=$(sed -n ''$j'p' FINAL.CRD | cut -c 23-37)
那是因为我通常知道我需要的信息在哪里,在那种情况下是在字符 23 和 37 之间。
我正在尝试用 python 做同样的事情,但我没有找到如何使用 np.loadtxt
我的文本文件是这样的:
IMPZ 3 WWA 3.06 4.51 7.32
MTSF 2 W W 1.52 1.72 0.18
PI01 2 AA 4.02 3.32 10.26
PI02 2 A A 4.58 2.29 0.40
我想得到 3.06、1.52、4.02、4.58。但是,有时文件会显示“WWA”或“W W”,因此我无法使用 usecols。但是我知道这个数字总是在行的哪一部分,这就是为什么我想要像 cut -c 这样对字符/字节偏移量进行操作的原因。
请您参考如下方法:
此np.loadtxt 解决方案归功于 Jon Clements:
np.loadtxt('FINAL.CRD', usecols=-3) 返回每行末尾的第三个字段(默认情况下,空格用作分隔符):
In [193]: np.loadtxt('FINAL.CRD', usecols=-3)
Out[193]: array([ 3.06, 1.52, 4.02, 4.58])
即使文件每一行可能包含不同数量的字段,只要您要查找的值可以被表征为“倒数第三个字段”,那么 np.loadtxt('FINAL .CRD', usecols=-3) 可以完成这项工作。
下面是如何使用 NumPy 读取具有固定宽度字段的文件:
np.genfromtxt可以通过将整数(宽度)列表指定为 delimeter 来读取具有固定宽度字段的文件:
In [180]: np.genfromtxt('FINAL.CRD', dtype=None, delimiter=[22,37-22], usecols=[1])
Out[180]:
array([b'WWA 3.06', b'W W 1.52', b' AA 4.02',
b'A A 4.58'],
dtype='|S15')
在哪里
% cat FINAL.CRD
IMPZ 3 WWA 3.06 4.51 7.32
MTSF 2 W W 1.52 1.72 0.18
PI01 2 AA 4.02 3.32 10.26
PI02 2 A A 4.58 2.29 0.40
% sed -n ${j}p FINAL.CRD | cut -c 23-37
WWA 3.06
W W 1.52
AA 4.02
A A 4.58
然而,使用 cut -c 指定列索引,使用 np.genfromtxt 指定 delimiter 中字段的宽度范围。因此,第一个字段(我们想要忽略的)的宽度为 22,第二个字段(我们想要的)的宽度为 37-22。要仅获取第二个字段,请指定 usecols=[1]。
也许我误解了文件格式,但如果你想要 [ 3.06, 1.52, 4.02, 4.58], 然后根据您发布的文件,np.genfromtxt 命令将是:
In [181]: np.genfromtxt('FINAL.CRD', dtype=None, delimiter=[25,37-25], usecols=[1])
Out[181]: array([ 3.06, 1.52, 4.02, 4.58])
