awk拆分并在命令中运行计算

时间:2016-03-18 18:07:31

标签: awk

这是我自己的学习,但是我可以说我有input文件,在运行awk命令之前需要在$5之前拆分-。基本上,我使用$5汇总所有匹配的$3-$2字符串,输出行和总数,但没有拆分它们都是不同的。我之前可以分割文件,但我很好奇,如果我可以在一个awk中完成所有事情。如果在运行awk之前拆分了命令,则命令对文件起作用。谢谢你:)。

输入

chr1     955543 955763  chr1:955543-955763  AGRN-6|gc=75
chr1    957571  957852  chr1:957571-957852  AGRN-7|gc=61.2

AWK

awk '{split($5,a,"-"); a[1]} {c1[$a1]++; c2[$a1]+=($3-$2)} 
 END{for (e in c1) print e, c1[e], c2[e]}' input > out

**当前输出**(没有拆分)

AGRN-6 220 
AGRN-7 281

所需的输出

AGRN 2 501

1 个答案:

答案 0 :(得分:2)

我在脚本中看到的唯一问题是对c1[$a1]c2[$a1]的引用。请记住,美元符号不是字符串的指示符,您应该更多地考虑选择器或数组,其索引是该行上字段的位置。

这意味着$a1不是变量a1的值,而是a1变量中字段中的值。为了证明:

$ echo "one two three" | awk '{ n=2; print $n }'

只需删除多余的美元符号即可。您应该好好去。

顺便说一下,当我运行不正确的脚本时,我没有获得与您相同的输出。相反,我收到一个错误:

awk: illegal field $(), name "a1"
 input record number 1, file inp1
 source line number 1

我正在使用BSD awk。当我使用GNU awk(gawk)运行脚本时,我没有得到错误。如果您要进行大量的awk编程,我建议你选择另外一两个awk,看看不同的实现如何解析你的代码,当事情没有按预期运行时。