首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将逗号分隔的值拆分为多行?

问如何将逗号分隔的值拆分为多行?
EN

Stack Overflow用户
提问于 2019-08-29 07:30:44
回答 2查看 1.1K关注 0票数 3

我试图将多个逗号分隔的值分割成行。

我用逗号分隔的值(使用awk)的少数列实现了它,但是在我的实际表中,我必须在80列中完成它。所以,我在寻找一种迭代的方法。

我需要分割的输入示例:

代码语言:javascript
复制
CHROM  POS REF  ALT   GT_00  C_00  D_OO  E_00 F_00  GT_11 
 chr1  10   T    A     2,2   1,1   0,1   1,2   1,0   2
 chr1  10   T    G     3      2     1     2     0    0

预期产出:

代码语言:javascript
复制
chr1  10    T    A     2      1     0     1     1   2
chr1  10    T    A     2      1     1     2     0   2
chr1  10    T    G     3      2     1     2     0   0

我是用以下代码完成的:

代码语言:javascript
复制
 awk 'BEGIN{FS=OFS="\t"}
  {
    j=split($5,a,",");split($6,b,",");
    split($7,c,",");split($8,d,",");split($9,e,",");
    for(i=1;i<=j;++i)
    {
      $5=a[i];$6=b[i];$7=c[i];$8=d[i];$9=e[i];print
    }}'

但是,正如我以前说过的,在我的实际数据中有80列(或更多)带有逗号分隔的值。

有没有一种使用迭代的方法?

注意:我需要使用bash (不是MySQL,SQL,python.)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-29 08:19:27

这个awk可以做到:

文件:

代码语言:javascript
复制
chr1    10      T       A       2,2     1,1     0,1     1,2     1,0     2
chr1    10      T       G       3       2       1       2       0       0
chr1    10      T       C       5       1,2,3   4,2,1   7       1,8,3   3
chr1    10      T       D       1,2,3,5 4,2,1,8 1,8,3,2 3       5       7

解决方案:

代码语言:javascript
复制
awk '{
    n=0;
    for(i=5;i<=NF;i++) {
        t=split($i,a,",");if(t>n) n=t};
    for(j=1;j<=n;j++) {
        printf "%s\t%s\t%s\t%s",$1,$2,$3,$4;
        for(i=5;i<=NF;i++) {
            split($i,a,",");printf "\t%s",(a[j]?a[j]:a[1])
            };
        print ""
        }
    }' file
chr1    10      T       A       2       1       0       1       1       2
chr1    10      T       A       2       1       1       2       1       2
chr1    10      T       G       3       2       1       2       0       0
chr1    10      T       C       5       1       4       7       1       3
chr1    10      T       C       5       2       2       7       8       3
chr1    10      T       C       5       3       1       7       3       3
chr1    10      T       D       1       4       1       3       5       7
chr1    10      T       D       2       2       8       3       5       7
chr1    10      T       D       3       1       3       3       5       7
chr1    10      T       D       5       8       2       3       5       7

您的测试输入给出:

代码语言:javascript
复制
chr1    10      T       A       2       1       0       1       1       2
chr1    10      T       A       2       1       1       2       1       2
chr1    10      T       G       3       2       1       2       0       0

如果逗号分隔值是连续的,则不重要,只要您不将2或3个逗号混合在同一行上。

票数 1
EN

Stack Overflow用户

发布于 2019-08-30 09:02:24

这是另一只鹰。与以前将字段拆分为数组的解决方案不同,我们使用替换来解决这个问题。没有字段迭代正在进行:

代码语言:javascript
复制
awk '
BEGIN { OFS="\t" }
     { $1=$1;t=$0; }
     { while(index($0,",")) {
         gsub(/,[[:alnum:],]*/,""); print;
         $0=t; gsub(OFS "[[:alnum:]]*,",OFS); t=$0;
       }
       print t
     }' file

它是如何工作的:这个想法是基于两种类型的替换:

  1. gsub(/,[[:alnum:],]*/,"")**:** --这将删除以逗号:1,2,3,4 -> 1开头的字母、数字字符和逗号所生成的所有子字符串。这不会改变没有逗号的字段。
  2. gsub(OFS "[[:alnum:]]*,",OFS)**:** --这将移除字母数字字符,后面跟着一个逗号,并位于字段的开头:1,2,3,4 -> 2,3,4

因此,使用这两个替换,我们迭代直到没有逗号。有关[[:alnum:]]的详细信息,请参阅[[:alnum:]]

输入:

代码语言:javascript
复制
chr1    10      T       A       2,2     1,1     0,1     1,2     1,0     2
chr1    10      T       G       3       2       1       2       0       0
chr1    10      T       C       5       1,2,3   4,2,1   7       1,8,3   3
chr1    10      T       D       1,2,3,5 4,2,1,8 1,8,3,2 3       5       7

输出:

代码语言:javascript
复制
chr1    10  T   A   2   1   0   1   1   2
chr1    10  T   A   2   1   1   2   0   2
chr1    10  T   G   3   2   1   2   0   0
chr1    10  T   C   5   1   4   7   1   3
chr1    10  T   C   5   2   2   7   8   3
chr1    10  T   C   5   3   1   7   3   3
chr1    10  T   D   1   4   1   3   5   7
chr1    10  T   D   2   2   8   3   5   7
chr1    10  T   D   3   1   3   3   5   7
chr1    10  T   D   5   8   2   3   5   7
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57705187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档