通过Linux组织文件

时间:2016-04-01 14:17:05

标签: linux file awk

我要感谢大家的帮助和支持。好吧,我有以下文件:

name   id alello chr    pos snp    
s1     215     a    1   11  a215    
s1     216     a    1   11  a216    
s1     217     a    1   11  a217    
s1     218     a    1   11  a218    
s2     215     b    2   22  b215    
s2     216     b    2   22  b216    
s2     217     b    2   22  b217    
s2     218     b    2   22  b218

我需要这样的文件:

snp allelo  chr pos 215     216      217    218    
s1     a    1   11  a215    a216    a217    a218    
s2     b    2   22  b215    b216    b217    b218

拜托,有人可以帮帮我吗?非常感谢你

2 个答案:

答案 0 :(得分:1)

awk救援!

$ awk 'NR==1{h=$1 OFS $3 OFS $4 OFS $5; next} 
            {a[$1]=(($1 in a)?(a[$1] OFS $NF):($3 OFS $4 OFS $5 OFS $6));
             if(!($2 in b)) {h=h OFS $2; b[$2]}} 
        END{print h; for(k in a) print k,a[k]}' file | column -t

name  alello  chr  pos  215   216   217   218
s1    a       1    11   a215  a216  a217  a218
s2    b       2    22   b215  b216  b217  b218

答案 1 :(得分:0)

$ cat tst.awk
NR == 1     { hdr = $1 OFS $3 OFS $4 OFS $5; next }
!seen[$2]++ { hdr = hdr OFS $2 }

$1 != prev  {
    if (++numRows > 1) {
        if (numRows == 2) {
            print hdr
        }
        print row
    }
    row = $1 OFS $3 OFS $4 OFS $5
}
{ row = row OFS $6; prev = $1 }
END { print row }

$ awk -f tst.awk file | column -t
name  alello  chr  pos  215   216   217   218
s1    a       1    11   a215  a216  a217  a218
s2    b       2    22   b215  b216  b217  b218

请注意,这将按照它们在输入中出现的顺序输出行,并且它一次只在内存中存储一​​行,因此无论输入文件有多大,它都能正常工作。