Shell 通过加法和乘法进行文本操作
我有一个名为“test_file”的文本文件,包含6行7列,如下所示Shell 通过加法和乘法进行文本操作,shell,for-loop,awk,sh,Shell,For Loop,Awk,Sh,我有一个名为“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 我想在第二列和第三列中进行一些文本处
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=$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
中,并在最后打印。延迟打印将打印修改后的记录,最后一条记录将不被修改
您也可以指定数字格式,但我认为这并不重要
要运行多个增量,只需添加一个外部循环
$ 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
要在一个范围内循环并将其保存在不同的文件中,可以执行以下操作。我还提供了其他参数,以便您可以在运行脚本时设置它们:
#!/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
#/bin/bash
以美元为单位的val(序号2.1 0.1 2.5)
做
awk-vval=$val-vfmul=2.9-vadd=0.2-vsmul=4.227'{
如果(NR==1 | | NR==2){
$3=val;
$2=$3*fmul
}否则如果(NR>=3&&NR@lijun,请阅读代码并尝试不同的增量。这应该不难,因为只有一行处理计算。您可以将输出重定向到一个文件,添加>output.file.name
。您不能嵌套awk
这样的脚本,请参阅我的更新。外部循环是运行awk
的bash循环多次。在一个awk
脚本中也可以使用另一种方法。awk脚本中唯一的变化是增量。..
只是需要从原始脚本复制的占位符。抱歉,这太牵手了。如果你认真编程,你需要更加努力。我需要不同的值我需要2.1而不是4.227我需要4.0伟大的你真的是一个专家…感谢你的支持…在这里我接受你的答案…非常简单明了
#!/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