如何识别列中的数字并在该数字中添加特定数字
Posted
技术标签:
【中文标题】如何识别列中的数字并在该数字中添加特定数字【英文标题】:How to identify a number in a column and add a specific number in that number 【发布时间】:2021-04-16 03:23:28 【问题描述】:我有一个文件 CASE.dat 文件
# X Y Z TARGET MY DIST MY DATA
--------------------------------------------------------------------------------
1 16.136051 19.214215 26.195842 0.935901 0.528294 10305.052469
2 19.296614 20.459830 20.711839 4.033354 1.152114 258.468669
3 21.757247 20.010601 21.609096 4.008830 1.117961 208.482335
4 23.340579 20.230572 20.299311 0.962172 0.567720 1648.046276
5 22.232850 19.276643 24.105109 4.028086 1.105535 116.818198
6 20.177439 18.995924 25.744873 4.020979 1.119227 259.240957
7 20.507640 18.422719 27.698151 0.973875 0.578381 4433.058006
8 17.718280 19.441795 24.896309 4.052598 1.117063 399.224573
9 17.274647 20.170761 22.411821 4.049756 1.067280 369.719958
10 15.344147 20.532170 21.791338 0.942252 0.522218 2903.487129
11 16.747362 21.490591 16.828061 4.119692 1.052854 640.628897
12 18.942734 21.191117 18.059497 4.016967 1.013168 370.875172
13 16.713317 22.043861 14.846116 0.952206 0.572128 15824.211118
14 14.917097 21.194983 17.726730 0.996560 0.573948 8439.378683
15 20.697846 21.496657 17.007974 0.931434 0.494488 4811.530560
16 24.891192 18.784856 25.017254 4.004345 1.086042 87.628933
17 24.849590 17.270757 26.442292 0.986123 0.548764 2084.437203
18 26.020588 18.043376 23.429171 0.962405 0.489209 5797.201598
19 29.699839 22.572565 28.810307 4.025628 1.079363 339.526719
20 31.243469 22.179022 30.120360 0.974974 0.569833 5998.952157
21 29.172195 25.093904 28.162412 3.991001 1.124966 301.999963
我的目标是对第 5 列进行一些处理。
我使用下面的脚本提取它
cat CASE.dat | awk 'print $5' | awk NF | awk 'NR>1'
这给了我
0.935901
4.033354
4.008830
0.962172
4.028086
4.020979
0.973875
4.052598
4.049756
0.942252
4.119692
4.016967
0.952206
0.996560
0.931434
4.004345
0.986123
0.962405
4.025628
0.974974
3.991001
现在我需要一个可以改进我上面的脚本的建议。
此外,我这里有两种号码,一种是~4
,另一种是~1
。我想将2.0
添加到所有~4
和1.0
在所有~1
的数字中。
请提出任何简单的答案。
这个结果应该是
1.935901
6.033354
6.008830
1.962172
6.028086
6.020979
1.973875
6.052598
6.049756
1.942252
6.119692
6.016967
1.952206
1.996560
1.931434
6.004345
1.986123
1.962405
6.025628
1.974974
5.991001
最后,我想从 6 中减去 ~6
(这个数字在另一个文件中可能会有所不同)和从 2 中减去 ~1
(这个数字在另一个文件中可能会有所不同)。
最终数据应该是
0.064099
-0.033354
-0.00883
0.037828
-0.028086
-0.020979
0.026125
-0.052598
-0.049756
0.057748
-0.119692
-0.016967
0.047794
0.00344
0.068566
-0.004345
0.013877
0.037595
-0.025628
0.025026
0.008999
【问题讨论】:
你的整个awk调用可以简化为awk 'NR>1print $5' CASE.dat
完美。所以现在我的期望是:将2
添加到接近4的数字中,然后从6中减去,然后将1
添加到接近1
的数字中并从2中减去。
那么你的代码就没什么用了,因为你需要有$6
和$2
。尝试考虑如何到达那里,并更具体。对我来说,3 接近 4。
没错,这就是我要说的。我需要将2
添加到所有接近 4 的 $5 和 1
到接近 1
的所有数字中,然后减去那些接近 4 的数字(在添加 2 之后,这些直到成为〜 6)从 6 开始,对于那些接近 1 的(加 1 后,它将是 ~2)从 2 开始。
【参考方案1】:
你不能用这个awk
:
awk -v d='0.009' 'NR <= 2 next n = int($5+d) n == 4 $5 += 2 n == 1 $5 += 1 n = int($5+d) n==6 || n==1 $5 = n - $5 print $5' case.dat
0.935901
-0.033354
-0.00883
0.962172
-0.028086
-0.020979
0.973875
-0.052598
-0.049756
0.942252
-0.119692
-0.016967
0.952206
1.99656
0.931434
-0.004345
0.986123
0.962405
-0.025628
0.974974
0.008999
更易读的格式:
awk -v d='0.009' 'NR <= 2 next
n = int($5+d)
n == 4 $5 += 2
n == 1 $5 += 1
n = int($5+d)
n == 6 || n == 1
$5 = n - $5
print $5' case.dat
【讨论】:
谢谢@Anubhava,但您只指出数字 4。您仍然看到,值 3.991001 的数字在接近 4 时不是进程。 请澄清这里的亲密度是什么?方差应该是多少?0.005
够好吗?
我只有两种号码。一个是~4,另一个是~1。在这里很难给出任何定义。
我的帖子有错误。让我更新一下。
我已经更新了。减法有一个小错误。现在你看到一些数字是负数。【参考方案2】:
给你:
import math
import numpy as np
with open("CASE.dat", "r") as msg:
data = msg.readlines()
for i, line in enumerate(data[2:]):
row = list(map(float, line.strip().split()))
if round(row[4]) == 1:
val = 1
elif round(row[4]) == 4:
val = 2
row[4] = row[4] + val
if round(row[4]) == 6:
row[4] = 6 - row[4]
elif round(row[4]) == 2:
row[4] = np.abs(row[4] - 2)
data[i+2] = " ".join(map(str,row))
for row in data:
print (row)
你得到:
# X Y Z TARGET MY DIST MY DATA
--------------------------------------------------------------------------------
1.0 16.136051 19.214215 26.195842 0.06409900000000013 0.528294 10305.052469
2.0 19.296614 20.45983 20.711839 -0.033354000000000106 1.152114 258.468669
3.0 21.757247 20.010601 21.609096 -0.008829999999999671 1.117961 208.482335
4.0 23.340579 20.230572 20.299311 0.03782799999999997 0.56772 1648.046276
5.0 22.23285 19.276643 24.105109 -0.028086000000000055 1.105535 116.818198
6.0 20.177439 18.995924 25.744873 -0.020978999999999637 1.119227 259.240957
7.0 20.50764 18.422719 27.698151 0.026124999999999954 0.578381 4433.058006
8.0 17.71828 19.441795 24.896309 -0.0525979999999997 1.117063 399.224573
9.0 17.274647 20.170761 22.411821 -0.049756000000000355 1.06728 369.719958
10.0 15.344147 20.53217 21.791338 0.05774800000000013 0.522218 2903.487129
11.0 16.747362 21.490591 16.828061 -0.11969199999999969 1.052854 640.628897
12.0 18.942734 21.191117 18.059497 -0.016967000000000176 1.013168 370.875172
13.0 16.713317 22.043861 14.846116 0.047794000000000114 0.572128 15824.211118
14.0 14.917097 21.194983 17.72673 0.0034399999999998876 0.573948 8439.378683
15.0 20.697846 21.496657 17.007974 0.06856600000000013 0.494488 4811.53056
16.0 24.891192 18.784856 25.017254 -0.004344999999999821 1.086042 87.628933
17.0 24.84959 17.270757 26.442292 0.013876999999999917 0.548764 2084.437203
18.0 26.020588 18.043376 23.429171 0.037595000000000045 0.489209 5797.201598
19.0 29.699839 22.572565 28.810307 -0.025628000000000206 1.079363 339.526719
20.0 31.243469 22.179022 30.12036 0.025025999999999993 0.569833 5998.952157
21.0 29.172195 25.093904 28.162412 0.008999000000000201 1.124966 301.999963
【讨论】:
您的结果更接近我的预期。你能稍微修改一下你的脚本,这样我就不需要将1
添加到接近~1的数字吗?
我创建了一个带有标题 #!/usr/bin/python 的 case.py 脚本,但它没有给出任何输出。
我收到错误 $python case.py Traceback (最近一次调用最后一次): File "case.py", line 6, in 以上是关于如何识别列中的数字并在该数字中添加特定数字的主要内容,如果未能解决你的问题,请参考以下文章