通过加法和乘法进行文本操作



我保存了一个名为"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,0.2=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=$0; v=$3; $3+=0.1; $2*=$3/v; p=$0} 
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中,并在END处打印。延迟打印将打印修改后的记录,最后一条记录将不修改。

你也可以指定数字格式,但我认为这并不重要。。。

要运行多个增量,只需添加一个外循环

$ for inc in {1..5}; 
do awk -v inc=$inc '...
... $3+=(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
$3=val;                   # set column 3 to val
$2=$3*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
$3=val+0.2;               # set column 3 to val+0.2
$2=$3*4.227               # set column 2 to column 3 multiplied with 4.227
} else $3=$3;               # 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) {
$3=val;
$2=$3*fmul
} else if(NR>=3 && NR<=5) {
$3=val+add;
$2=$3*smul
} else $3=$3;
print
}' test_file > output$val
done

最新更新