Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 通过加法和乘法进行文本操作_Shell_For Loop_Awk_Sh - Fatal编程技术网

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

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 我想在第二列和第三列中进行一些文本处

我有一个名为“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=$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