Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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
如何使用awk计算和并替换文件中的列_Awk - Fatal编程技术网

如何使用awk计算和并替换文件中的列

如何使用awk计算和并替换文件中的列,awk,Awk,我对这个网站和编程世界都是新手,希望你有时间帮助我。 我的问题如下:我有一个包含多个列的文件。在第二列中有一些值。我尝试将每个值的总和计算为给定的数字,并将第二列替换为包含总和结果的新列。 下面是我的输入示例: A B C x 1 t y 2 u z 3 v 我想将B列中的值求和为5,并获得如下输出: A B C x 6 t y 7 u z 8 v 我尝试失败的代码是 zcat my_file.vcf.gz| tail -n +49 | awk 'BEGIN{FS=OFS="\t&

我对这个网站和编程世界都是新手,希望你有时间帮助我。 我的问题如下:我有一个包含多个列的文件。在第二列中有一些值。我尝试将每个值的总和计算为给定的数字,并将第二列替换为包含总和结果的新列。 下面是我的输入示例:

A B C
x 1 t
y 2 u
z 3 v
我想将B列中的值求和为5,并获得如下输出:

A B C
x 6 t
y 7 u
z 8 v
我尝试失败的代码是

zcat my_file.vcf.gz| tail -n +49 | awk 'BEGIN{FS=OFS="\t"} {print $0, $2+5}'>my.output.vcf
提前感谢

您可以使用

awk 'BEGIN{FS=OFS="\t"} {$2+=5}1'
此处,
$2+=5
5
添加到已归档的2值中,
1
将触发记录的显示(行,行,与
打印$0
相同)

见:


为清晰起见,另一种形式为:

awk 'BEGIN{FS=OFS="\t"} {print $1, $2+5, $3}'

我们可以避免使用
tail
,因为第49行的行打印可以在
awk
本身内处理。您还需要在第二个字段中添加值,然后可以通过
print
命令打印整行内容

重要的一点是,根据OP的示例,如果第二个字段有字母,则不需要在其中添加
5
,所以这里也要注意这个条件

zcat my_file.vcf.gz | 
awk '
  BEGIN{ FS=OFS="\t" }
  FNR>=49{
    $2=($2~/[a-zA-Z]/?$2:$2+5)
    print
  }
' > my.output.vcf
您可以使用:

awk 'BEGIN {FS=OFS="\t"} NR == 1 {print $0}   NR > 1 {print $1,($2+5),$3;}'
输出:

A       B       C
x       6       t
y       7       u
z       8       v

Maube这可以帮助您:

cat file | awk '{if (NR > 1 && $2 = ($2+5)) 
                     print $0;
                else print $0;}'
答案适用于您的代码:

zcat my_file.vcf.gz| tail -n +49 | awk '{if (NR > 1 && $2 = ($2+5)) print $0; else print $0;}' > my.output.vcf

可以使用FNR参数,谢谢,不幸的是,您的代码给了我一个错误如下:“awk:line 1:打印处或打印附近的语法错误”@MrGoodcat,老实说,当我测试它时,它对我很好,您使用的是哪种操作系统?@RavinerdSingh13我使用的是Ubuntu 18.04.5 LTS。无论如何,我会进一步检查我是否犯了错误。
cat file | awk '{if (NR > 1 && $2 = ($2+5)) 
                     print $0;
                else print $0;}'
zcat my_file.vcf.gz| tail -n +49 | awk '{if (NR > 1 && $2 = ($2+5)) print $0; else print $0;}' > my.output.vcf
cat boo
A       B       C
x       1       t
y       2       u
z       3       v

cat boo | awk 'BEGIN{FS=OFS="\t"} $2 ~ /^[0-9]+$/ {print $1, $2+5, $3}  $2 !~ /^[0-9]+$/ {print} '
A       B       C
x       6       t
y       7       u
z       8       v