这是我自己的学习,但是我可以说我有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
答案 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,看看不同的实现如何解析你的代码,当事情没有按预期运行时。