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{,这应该就够了。