如何使用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