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;iawk
有一个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如果有人阅读解释,我通常不会给出解释,而是让读者自己去思考,试着弄明白,必要时提问:-)。