Bash 找出数字之间的模式并求和?

Bash 找出数字之间的模式并求和?,bash,shell,awk,sed,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 480641

我的档案:

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}'
但它的和也是不正确的空白列。事实上,这是真的,因为我已经将“,”替换为tab

如果我们知道最后几列,我们会做得很好

cat test.bed | sed 's/\,/\t/g' | awk '{OFS="\t"; print $1,$2,$3,$4+$5+$6+$7}'

但是,我使用了
NF
表示从第4列到最后一列,假设我们不知道文件中有多少图案及其编号。

您可以拆分最后一个字段并对其部分求和:

$ 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

$awk'{n=split($NF,a,“,”);对于(i=1;i您可以拆分最后一个字段并对其部分求和:

$ 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

$awk'{n=split($NF,a,“,”);对于(i=1;i您可以拆分最后一个字段并对其部分求和:

$ 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

$awk'{n=split($NF,a,“,”);对于(i=1;i您可以拆分最后一个字段并对其部分求和:

$ 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

$awk'{n=split($NF,a,“,”);for(i=1;i
awk
有一个
split
函数,该函数基于RE拆分字符串并将部分放入数组变量,您可以
拆分逗号上每行的最后一个字段,然后对数组的元素求和

NF==4{split($4,arr,','); $4 = 0; for(i in arr) $4+=arr[i];}
1
NB1当且仅当$4中的数字之间没有空格时,此选项才有效

NB2最后一个
1
强制打印当前行

awk
有一个
split
函数,该函数基于RE拆分字符串并将部分放入数组变量,您可以
拆分逗号上每行的最后一个字段,然后对数组的元素求和

NF==4{split($4,arr,','); $4 = 0; for(i in arr) $4+=arr[i];}
1
NB1当且仅当$4中的数字之间没有空格时,此选项才有效

NB2最后一个
1
强制打印当前行

awk
有一个
split
函数,该函数基于RE拆分字符串并将部分放入数组变量,您可以
拆分逗号上每行的最后一个字段,然后对数组的元素求和

NF==4{split($4,arr,','); $4 = 0; for(i in arr) $4+=arr[i];}
1
NB1当且仅当$4中的数字之间没有空格时,此选项才有效

NB2最后一个
1
强制打印当前行

awk
有一个
split
函数,该函数基于RE拆分字符串并将部分放入数组变量,您可以
拆分逗号上每行的最后一个字段,然后对数组的元素求和

NF==4{split($4,arr,','); $4 = 0; for(i in arr) $4+=arr[i];}
1
NB1当且仅当$4中的数字之间没有空格时,此选项才有效


NB2最后一个
1
强制打印当前行

我怀疑
OFS=\\t
是可取的。或者
awk'{…}'OFS=\\t filename
。这允许您更改每个文件的值:
awk'{…}'OFS=a file1 OFS=b file2
。由于我不知道的原因,这是最有用的形式,但使用最少。+1因为访问数组元素的顺序无关紧要,您可以只使用
in
操作符:
拆分($NF,a,/,/);For(a中的i)s+=a[i]
。对于split()的3rg arg,我使用了regexp分隔符而不是字符串分隔符,因为它是一个regexp,所以这是一个很好的习惯。@EdMorton谢谢!事实上,我在我的解释中对此进行了评论。(我总是想知道是否有人读过它们:D)@fedorqui哦,是的,你也这么做了。idk如果有人阅读解释,我通常不会给出解释,而是让读者自己去思考,试着找出答案,必要时提问:-)。我怀疑
OFS=\\t
是可取的。或者
awk'{…}'OFS=\\t filename
。这允许您更改每个文件的值:
awk'{…}'OFS=a file1 OFS=b file2
。由于我不知道的原因,这是最有用的形式,但使用最少。+1因为访问数组元素的顺序无关紧要,您可以使用
中的
操作符:
拆分($NF,a,/,/);for(a中的i)s+=a[i]
。对于split()的3rg arg,我使用了regexp分隔符而不是字符串分隔符,因为它是一个regexp,所以这是一个很好的习惯。@EdMorton谢谢!事实上,我在我的解释中对此进行了评论。(我总是想知道是否有人读过它们:D)@fedorqui哦,是的,你也这么做了。idk如果有人阅读解释,我通常不会给出解释,而是让读者自己去思考,试着找出答案,必要时提问:-)。我怀疑
OFS=\\t
是可取的。或者
awk'{…}'OFS=\\t filename
。这允许您更改每个文件的值:
awk'{…}'OFS=a file1 OFS=b file2
。由于我不知道的原因,这是最有用的形式,但使用最少。+1因为访问数组元素的顺序无关紧要,您可以使用
中的
操作符:
拆分($NF,a,/,/);for(a中的i)s+=a[i]
。对于split()的3rg arg,我使用了regexp分隔符而不是字符串分隔符,因为它是一个regexp,所以这是一个很好的习惯。@EdMorton谢谢!事实上,我在我的解释中对此进行了评论。(我总是想知道是否有人读过它们:D)@fedorqui哦,是的,你也这么做了。idk如果有人阅读解释,我通常不会给出解释,而是让读者自己去思考,试着找出答案,必要时提问:-)。我怀疑
OFS=\\t
是可取的。或者
awk'{…}'OFS=\\t filename
。这允许您更改每个文件的值:
awk'{…}'OFS=a file1 OFS=b file2
。由于我不知道的原因,这是最有用的形式,但使用最少。+1因为访问数组元素的顺序无关紧要,您可以使用
中的
操作符:
拆分($NF,a,/,/);for(a中的i)s+=a[i]
。对于split()的3rg arg,我使用了regexp分隔符而不是字符串分隔符,因为它是一个regexp,所以这是一个很好的习惯。@EdMorton谢谢!事实上,我在我的解释中对此进行了评论。(我总是想知道是否有人读过它们:D)@fedorqui哦,是的,你也这么做了。idk如果有人阅读解释,我通常不会给出解释,而是让读者自己去思考,试着弄明白,必要时提问:-)。