我试图将多个逗号分隔的值分割成行。
我用逗号分隔的值(使用awk)的少数列实现了它,但是在我的实际表中,我必须在80列中完成它。所以,我在寻找一种迭代的方法。
我需要分割的输入示例:
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预期产出:
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我是用以下代码完成的:
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.)
发布于 2019-08-29 08:19:27
这个awk可以做到:
文件:
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解决方案:
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您的测试输入给出:
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个逗号混合在同一行上。
发布于 2019-08-30 09:02:24
这是另一只鹰。与以前将字段拆分为数组的解决方案不同,我们使用替换来解决这个问题。没有字段迭代正在进行:
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它是如何工作的:这个想法是基于两种类型的替换:
gsub(/,[[:alnum:],]*/,"")**:** --这将删除以逗号:1,2,3,4 -> 1开头的字母、数字字符和逗号所生成的所有子字符串。这不会改变没有逗号的字段。gsub(OFS "[[:alnum:]]*,",OFS)**:** --这将移除字母数字字符,后面跟着一个逗号,并位于字段的开头:1,2,3,4 -> 2,3,4因此,使用这两个替换,我们迭代直到没有逗号。有关[[:alnum:]]的详细信息,请参阅[[:alnum:]]
输入:
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输出:
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 7https://stackoverflow.com/questions/57705187
复制相似问题