awk:对列的子集执行算术运算,并使用修改的值打印所有列

awk:对列的子集执行算术运算,并使用修改的值打印所有列,awk,Awk,我有一些列包含一些值,例如: A 10 20 30 AA AAA AAAA B 40 50 60 BB BBB BBBB C 70 80 90 CC CCC CCCC 我想对cols 2,3,4执行一个算术运算,比如乘法,然后返回一个新表 A 100 200 300 AA AAA AAAA B 400 500 600 BB BBB BBBB C 700 800 900 CC CCC CCCC 我可以使用 awk '{print $2*10"\s"$3*10"\s

我有一些列包含一些值,例如:

A 10 20 30 AA AAA AAAA
B 40 50 60 BB BBB BBBB
C 70 80 90 CC CCC CCCC
我想对cols 2,3,4执行一个算术运算,比如乘法,然后返回一个新表

A 100 200 300 AA AAA AAAA
B 400 500 600 BB BBB BBBB
C 700 800 900 CC CCC CCCC
我可以使用

awk '{print $2*10"\s"$3*10"\s"$4*10}' inp > out

但是不知道如何用修改过的值打印整个表。在awk中是否有这样做的方法?

在您的示例中,您可以一起计算和打印。使用awk,您可以先对字段进行任何修改,最后打印所有行或其中的一部分,如下所示:

awk '{$2=10*$2; $3=10*$3; $4=10*$4} {print}' file
{print}没有参数意味着{print$0},打印整行。它也可以被任何真实条件替换,如1,例如awk“1”文件意味着打印每一行

因此,您的命令也可以是:

awk '{$2=10*$2; $3=10*$3; $4=10*$4} 1' file
此外,在任何具有动作{}的实体之前,我们可以有条件。例如,如果我们想跳过前5行,则条件为NR>5,其中NR是记录,通常表示行号。因此,我们不考虑计算的5个第一行,而是将它们与所有行一起打印:

awk 'NR>5 {$2=10*$2; $3=10*$3; $4=10*$4} {print}' file
这里我们完全忽略了前5行,我们也不打印它们:

awk 'NR>5 {$2=10*$2; $3=10*$3; $4=10*$4; print}' file

在您的示例中,一起计算和打印。使用awk,您可以先对字段进行任何修改,最后打印所有行或其中的一部分,如下所示:

awk '{$2=10*$2; $3=10*$3; $4=10*$4} {print}' file
{print}没有参数意味着{print$0},打印整行。它也可以被任何真实条件替换,如1,例如awk“1”文件意味着打印每一行

因此,您的命令也可以是:

awk '{$2=10*$2; $3=10*$3; $4=10*$4} 1' file
此外,在任何具有动作{}的实体之前,我们可以有条件。例如,如果我们想跳过前5行,则条件为NR>5,其中NR是记录,通常表示行号。因此,我们不考虑计算的5个第一行,而是将它们与所有行一起打印:

awk 'NR>5 {$2=10*$2; $3=10*$3; $4=10*$4} {print}' file
这里我们完全忽略了前5行,我们也不打印它们:

awk 'NR>5 {$2=10*$2; $3=10*$3; $4=10*$4; print}' file

在这里添加一个通用解决方案,使用GNU awk中显示的示例编写和测试。只要提到awk的fields变量中的所有字段号,并用逗号分隔,然后提到要将字段相乘的数字,就可以了

awk -v multplyBy="10" -v fields="2,3,4" '
BEGIN{
  num=split(fields,arr,",")
  for(i=1;i<=num;i++){
    look[arr[i]]
  }
}
{
  for(i=1;i<=NF;i++){
    if(i in look){
      $i=($i * multplyBy)
    }
  }
}
1'  Input_file

注意:刚才在其他答案中看到了用户的评论。如果有人想跳过前5行,则将{before for loop更改为FNR>5{这应该就够了。

在这里添加一个通用解决方案,用GNU awk中显示的示例编写和测试。只需在awk的fields变量中用逗号分隔所有字段号,并提及要将字段相乘的数字,就可以了

awk -v multplyBy="10" -v fields="2,3,4" '
BEGIN{
  num=split(fields,arr,",")
  for(i=1;i<=num;i++){
    look[arr[i]]
  }
}
{
  for(i=1;i<=NF;i++){
    if(i in look){
      $i=($i * multplyBy)
    }
  }
}
1'  Input_file

注意:刚才在其他答案中看到了用户的评论。若有人想跳过前5行,那个么将{before for loop改为FNR>5{和P应该这样做。

把逻辑稍微向前一点,可以跳过行吗?所以让我在我的例子中说,前5行是NANS,我不想在操作期间考虑它们,但最后我想把NANS包含在最后输出中。在我的例子中,让我们先说一下,前5行是NANS,我不想在操作过程中考虑它们,但是最后我想把NANS包含在最后的输出中。刚才在其他答案中看到了用户的评论。{这应该就够了。刚才在其他答案中看到了用户的评论。如果有人想跳过前5行,那么将{before for loop更改为FNR>5{,这应该就够了。