在数字之间找到模式并总结它们?

时间:2015-02-10 13:51:58

标签: bash shell awk sed

我的档案:

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列到最后一栏,假设我们不知道文件中有多少模式及其数字。

2 个答案:

答案 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强制打印当前行

相关问题