我有一个文本文件,有 4 列 300 行。我想添加第五列,其中第一百行将是 1*0.02, 2*0.02... 的乘法,第一百行是 2.2, 2.4 ...
0.02
0.04
.
.
.
2 (in 100 lines)
2.2
2.4
.
.
.
12 (in 300 lines)
我的文本文件:
# "Frame" "Timestep" "WignerSeitz.interstitial_count" "WignerSeitz.vacancy_count"
0 0 0 0
1 100 0 0
2 200 0 0
3 300 0 0
.
.
98 9800 16 16
99 9900 16 16
100 10000 15 15
.
.
299 29900 48 48
300 30000 55 55
预期输出:
# "Frame" "Timestep" "WignerSeitz.interstitial_count" "WignerSeitz.vacancy_count"
0 0 0 0 0
1 100 0 0 0.02
2 200 0 0 0.04
3 300 0 0 0.06
.
.
98 9800 16 16 1.96
99 9900 16 16 1.98
100 10000 15 15 2
.
.
299 29900 48 48 11.8
300 30000 55 55 12
答案1
假设你的意思是在100之后,你需要为之后的每条记录添加0.2,使用awk
你可以执行类似以下代码的操作:
awk -v x=2 '{if($1<101){print $0 FS ($1*0.02)}else{x=x+0.2; print $0 FS x}}' file.txt
在哪里:
-v
用于让awk
您知道您正在使用x
具有初始值的变量2
$1<101
只要第一列小于,就可以让代码的第一部分工作101
FS
是静态变量,awk
其中包含文件的字段分隔符。
然后你可以根据你的要求调整你的步骤。
答案2
据我了解,您想要第 5 列,计算结果为第 1 列乘以 0.2
这可以通过以下方式完成awk
:
gawk '{printf "%s %.2f\n", $0,$1*0.02}'
答案3
您的规范和示例输出之间存在差异:从第 101 行到第 300 行,您想要的步长为 ,0.2
但最后一行以12
- 结尾,这是不可能的。 200 个 0.2 的步长将产生“40”——这将构成42
最后一行的 5 美元条目。如果这是真的,请尝试
$ awk '{print $0, ($1>100)*-18+$1*.02*(1+($1>100)*9)}' file
0 0 0 0 0
1 100 0 0 0.02
2 200 0 0 0.04
3 300 0 0 0.06
. 0
. 0
98 9800 16 16 1.96
99 9900 16 16 1.98
100 10000 15 15 2
101 10100 15 15 2.2
102 10200 15 15 2.4
. 0
199 19900 15 15 21.8
200 20000 15 15 22
201 20100 15 15 22.2
. 0
299 29900 48 48 41.8
300 30000 55 55 42