通过加法和乘法进行文本操作
text manipulation by addition and multiplication
我保存了一个名为 'test_file' 的文本文件,其中包含 6 行和 7 列,如下所示
0.00 5.8 2.0 5.0 6.0 8.0 0.0
10.00 5.8 2.0 1.0 1.0 1.2 9.6
10.00 9.3 2.2 2.0 1.4 2.5 9.6
30.00 9.3 2.2 1.2 1.5 1.9 1.4
30.00 9.3 2.2 3.2 2.4 1.2 4.1
60.00 9.8 3.5 1.4 2.7 3.2 4.5
我想在第二列和第三列中进行一些文本操作。
在第三列中,前两行值应该相同(2.0 和 2.0),接下来的三行值只是第二行值的 0.2 增量(2.0+0.2=2.2,2.0+0.2=2.2,2.0+ 0.2=2.2)。但是,我不想更改最后一行,我想保持原样。
在第二列之后,前两行的值应该是第三列的前两行与 2.9 的乘积。
类似地,第二列接下来的三行只是第三列接下来三行与 4.227
的乘积
我根本不想更改的其他列值。
现在我想依次更改第三列的前两行值,2.1,2.2....2.5,然后是相同的递增和乘法。
例如,当我将第三列的前两行值从原来的 2.0 更改为 2.1 时,预期输出应该是
0.00 6.09 2.1 5.0 6.0 8.0 0.0
10.00 6.09 2.1 1.0 1.0 1.2 9.6
10.00 9.722 2.3 2.0 1.4 2.5 9.6
30.00 9.722 2.3 1.2 1.5 1.9 1.4
30.00 9.722 2.3 3.2 2.4 1.2 4.1
60.00 9.8 3.5 1.4 2.7 3.2 4.5
并且我想以不同的名称保存输出文件,例如 file2.1.txt..file2.5.txt
awk
救援!
$ awk 'p {print p}
{pp=[=10=]; v=; +=0.1; *=/v; p=[=10=]}
END {print pp}' file | column -t
0.00 6.09 2.1 5.0 6.0 8.0 0.0
10.00 6.09 2.1 1.0 1.0 1.2 9.6
10.00 9.72273 2.3 2.0 1.4 2.5 9.6
30.00 9.72273 2.3 1.2 1.5 1.9 1.4
30.00 9.72273 2.3 3.2 2.4 1.2 4.1
60.00 9.8 3.5 1.4 2.7 3.2 4.5
由于要对最后一条记录进行特殊处理,使用前面的记录进行延迟处理p
,同时又希望最后一条记录不被修改,所以将原来的前面记录存入pp
,并在结尾。延迟打印会打印修改后的记录,最后一条不会被修改。
您也可以指定数字格式,但我认为这不重要...
到运行多次递增,只需要加一个外层循环
$ for inc in {1..5};
do awk -v inc=$inc '...
... +=(inc/10) ...
...' file > file."$inc".txt
done
您可以将增量(实际上是增量的 10 倍)作为变量传递给 awk
脚本,在脚本和输出文件名中使用。 awk
脚本中唯一的变化是增量。
如果您不能使用其他答案,这里有另一个版本:
awk -vval=2.1 '{ # set "val" to the new value for column 3 on first two lines
if(NR==1 || NR==2) { # if it's the first or second line
=val; # set column 3 to val
=*2.9 # set column 2 to column 3 multiplied with 2.9
} else if(NR>=3 && NR<=5) { # else if it's line 3-5
=val+0.2; # set column 3 to val+0.2
=*4.227 # set column 2 to column 3 multiplied with 4.227
} else =; # just for formatting
print # print the result
}' test_file
删除 运行 之前的评论 (#
)。
输出:
0.00 6.09 2.1 5.0 6.0 8.0 0.0
10.00 6.09 2.1 1.0 1.0 1.2 9.6
10.00 9.7221 2.3 2.0 1.4 2.5 9.6
30.00 9.7221 2.3 1.2 1.5 1.9 1.4
30.00 9.7221 2.3 3.2 2.4 1.2 4.1
60.00 9.8 3.5 1.4 2.7 3.2 4.5
要遍历一个范围并将其保存在不同的文件中,您可以像下面那样做。我还提供了其他参数,因此您可以在 运行 运行脚本时设置它们:
#!/bin/bash
for val in $(seq 2.1 0.1 2.5)
do
awk -vval=$val -vfmul=2.9 -vadd=0.2 -vsmul=4.227 '{
if(NR==1 || NR==2) {
=val;
=*fmul
} else if(NR>=3 && NR<=5) {
=val+add;
=*smul
} else =;
print
}' test_file > output$val
done
我保存了一个名为 'test_file' 的文本文件,其中包含 6 行和 7 列,如下所示
0.00 5.8 2.0 5.0 6.0 8.0 0.0
10.00 5.8 2.0 1.0 1.0 1.2 9.6
10.00 9.3 2.2 2.0 1.4 2.5 9.6
30.00 9.3 2.2 1.2 1.5 1.9 1.4
30.00 9.3 2.2 3.2 2.4 1.2 4.1
60.00 9.8 3.5 1.4 2.7 3.2 4.5
我想在第二列和第三列中进行一些文本操作。
在第三列中,前两行值应该相同(2.0 和 2.0),接下来的三行值只是第二行值的 0.2 增量(2.0+0.2=2.2,2.0+0.2=2.2,2.0+ 0.2=2.2)。但是,我不想更改最后一行,我想保持原样。
在第二列之后,前两行的值应该是第三列的前两行与 2.9 的乘积。 类似地,第二列接下来的三行只是第三列接下来三行与 4.227
的乘积我根本不想更改的其他列值。
现在我想依次更改第三列的前两行值,2.1,2.2....2.5,然后是相同的递增和乘法。
例如,当我将第三列的前两行值从原来的 2.0 更改为 2.1 时,预期输出应该是
0.00 6.09 2.1 5.0 6.0 8.0 0.0
10.00 6.09 2.1 1.0 1.0 1.2 9.6
10.00 9.722 2.3 2.0 1.4 2.5 9.6
30.00 9.722 2.3 1.2 1.5 1.9 1.4
30.00 9.722 2.3 3.2 2.4 1.2 4.1
60.00 9.8 3.5 1.4 2.7 3.2 4.5
并且我想以不同的名称保存输出文件,例如 file2.1.txt..file2.5.txt
awk
救援!
$ awk 'p {print p}
{pp=[=10=]; v=; +=0.1; *=/v; p=[=10=]}
END {print pp}' file | column -t
0.00 6.09 2.1 5.0 6.0 8.0 0.0
10.00 6.09 2.1 1.0 1.0 1.2 9.6
10.00 9.72273 2.3 2.0 1.4 2.5 9.6
30.00 9.72273 2.3 1.2 1.5 1.9 1.4
30.00 9.72273 2.3 3.2 2.4 1.2 4.1
60.00 9.8 3.5 1.4 2.7 3.2 4.5
由于要对最后一条记录进行特殊处理,使用前面的记录进行延迟处理p
,同时又希望最后一条记录不被修改,所以将原来的前面记录存入pp
,并在结尾。延迟打印会打印修改后的记录,最后一条不会被修改。
您也可以指定数字格式,但我认为这不重要...
到运行多次递增,只需要加一个外层循环
$ for inc in {1..5};
do awk -v inc=$inc '...
... +=(inc/10) ...
...' file > file."$inc".txt
done
您可以将增量(实际上是增量的 10 倍)作为变量传递给 awk
脚本,在脚本和输出文件名中使用。 awk
脚本中唯一的变化是增量。
如果您不能使用其他答案,这里有另一个版本:
awk -vval=2.1 '{ # set "val" to the new value for column 3 on first two lines
if(NR==1 || NR==2) { # if it's the first or second line
=val; # set column 3 to val
=*2.9 # set column 2 to column 3 multiplied with 2.9
} else if(NR>=3 && NR<=5) { # else if it's line 3-5
=val+0.2; # set column 3 to val+0.2
=*4.227 # set column 2 to column 3 multiplied with 4.227
} else =; # just for formatting
print # print the result
}' test_file
删除 运行 之前的评论 (#
)。
输出:
0.00 6.09 2.1 5.0 6.0 8.0 0.0
10.00 6.09 2.1 1.0 1.0 1.2 9.6
10.00 9.7221 2.3 2.0 1.4 2.5 9.6
30.00 9.7221 2.3 1.2 1.5 1.9 1.4
30.00 9.7221 2.3 3.2 2.4 1.2 4.1
60.00 9.8 3.5 1.4 2.7 3.2 4.5
要遍历一个范围并将其保存在不同的文件中,您可以像下面那样做。我还提供了其他参数,因此您可以在 运行 运行脚本时设置它们:
#!/bin/bash
for val in $(seq 2.1 0.1 2.5)
do
awk -vval=$val -vfmul=2.9 -vadd=0.2 -vsmul=4.227 '{
if(NR==1 || NR==2) {
=val;
=*fmul
} else if(NR>=3 && NR<=5) {
=val+add;
=*smul
} else =;
print
}' test_file > output$val
done