我的档案:
chr2 10145622 10170989 11
chr7 15682126 15682183 28
chr18 48064121 48064222 10,7
chr23 20637149 20637247 824,86
chr25 2063714 2072977 824,80,62,2
chr16 48064100 48064272 10,9
期望的输出:
chr2 10145622 10170989 11
chr7 15682126 15682183 28
chr18 48064121 48064222 17
chr23 20637149 20637247 910
chr25 2063714 2072977 968
chr16 48064100 48064272 19
我试过了:
cat test.bed | sed 's/\,/\t/g' | awk '{OFS="\t"; print $1,$2,$3,$4+NF}'
但它也是空白列的总和,这是不正确的。确实如此,因为我已经取代了#34;"进入标签。
如果我们知道最后一栏,运作良好
cat test.bed | sed 's/\,/\t/g' | awk '{OFS="\t"; print $1,$2,$3,$4+$5+$6+$7}'
但是,我使用NF
表示第4列到最后一栏,假设我们不知道文件中有多少模式及其数字。
答案 0 :(得分:2)
您可以拆分最后一个字段并对其各个部分求和:
$ awk '{n=split($NF, a, ","); for (i=1;i<=n;i++) s+=a[i]; $NF=s; s=0}1' file
chr2 10145622 10170989 11
chr7 15682126 15682183 28
chr18 48064121 48064222 17
chr23 20637149 20637247 910
chr25 2063714 2072977 968
chr16 48064100 48064272 19
要处理输入/输出字段分隔符,您可以说BEGIN {FS=OFS="\t"}
,例如。
n=split($NF, a, ",")
根据逗号分隔符拆分最后一个字段。这样,您就有一个数组a
,其中包含与切片部分一样多的值。 split()
会返回“件”的数量,因此我们将其存储起来。for (i=1;i<=n;i++) s+=a[i]; $NF=s; s=0
循环浏览a
中的项目列表,并将其与变量s
相加。 (注意:for (i in a)
也适用于这种情况,当订单无关紧要时)。然后,将最后一个字段设置为此值并重置计数器。1
评估为True时,会执行默认的awk
操作:打印当前行。答案 1 :(得分:1)
awk
有一个split
函数,它根据RE拆分字符串并将部分放入数组变量中,您可以split
逗号上每行的最后一个字段,然后对数组的元素求和
NF==4{split($4,arr,','); $4 = 0; for(i in arr) $4+=arr[i];}
1
NB1只有在4美元之间没有空格的情况下才会起作用
NB2最后1
强制打印当前行