Awk 使用Bash将两列(分隔)相乘

Awk 使用Bash将两列(分隔)相乘,awk,terminal,Awk,Terminal,我对awk非常基础,所以请帮我解决这个问题。我有三列,看起来像: ccd_x29807 Gly_GCC_89 0.333333 ccd_x29807 Gly_GCC_87 0.333333 ccd_x29807 Gly_GCC_88 0.333333 ccd_x20463 Lys_CTT_122 1 ccd_x29807 Gly_GCC_89 0.333333 9935.656731 ccd_x29807 Gly_GCC_87 0.333333 9935.656731 ccd_x29807 G

我对awk非常基础,所以请帮我解决这个问题。我有三列,看起来像:

ccd_x29807 Gly_GCC_89 0.333333
ccd_x29807 Gly_GCC_87 0.333333
ccd_x29807 Gly_GCC_88 0.333333
ccd_x20463 Lys_CTT_122 1
ccd_x29807 Gly_GCC_89 0.333333 9935.656731
ccd_x29807 Gly_GCC_87 0.333333 9935.656731
ccd_x29807 Gly_GCC_88 0.333333 9935.656731
ccd_x20463 Lys_CTT_122 1 20463
我要做的是将第一列中x之后的值与第三列中的数字相乘,然后在另一列中打印。因此,输出应该如下所示:

ccd_x29807 Gly_GCC_89 0.333333
ccd_x29807 Gly_GCC_87 0.333333
ccd_x29807 Gly_GCC_88 0.333333
ccd_x20463 Lys_CTT_122 1
ccd_x29807 Gly_GCC_89 0.333333 9935.656731
ccd_x29807 Gly_GCC_87 0.333333 9935.656731
ccd_x29807 Gly_GCC_88 0.333333 9935.656731
ccd_x20463 Lys_CTT_122 1 20463
我尝试了此操作,但它将0放在第一列:
cat file.csv | awk'{split$1,arr,;$1=arr[2]*$3}1'

在这里,您可以使用字符串函数match获取字段-1中x的位置,然后使用substr提取从“x”开始的数字,并将其保存在变量n中。然后只需输出整个记录并添加由n*$3计算的附加字段。例如:

awk '{n = substr($1, match($1, /x/) + 1); print $0, n * $3}' file
参考资料是一个很好的地方,可以提供关于每个函数的信息

示例输出


如果您还有其他问题,请告诉我。

在这里,您可以使用字符串函数match获取字段-1中x的位置,然后使用substr提取从“x”开始的数字,并将其保存在变量n中。然后只需输出整个记录并添加由n*$3计算的附加字段。例如:

awk '{n = substr($1, match($1, /x/) + 1); print $0, n * $3}' file
参考资料是一个很好的地方,可以提供关于每个函数的信息

示例输出

如果您还有其他问题,请告诉我。

改为用x分割

用x来代替


如果你打印出arr[2],你会看到一个问题。如果你打印出arr[2],你会看到一个问题。是的,我没有想过。谢谢:oguz ismail的想法是使用OFMT:awk'{print$0,$2*$4}'FS='[x]'OFMT='%.6f'文件是的,我没有想到。谢谢:oguz ismail的想法是使用OFMT:awk'{print$0,$2*$4}'FS='[x]'OFMT='%.6f'filenice,与GNU-awk类似,awk-v FPAT='[0-9]+\.?[0-9]+'{print$0,$1*$NF}nice,与GNU-awk类似,awk-v FPAT='[0-9]+\.“'print$0,$1*$NF'