我要感谢大家的帮助和支持。好吧,我有以下文件:
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
拜托,有人可以帮帮我吗?非常感谢你
答案 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
请注意,这将按照它们在输入中出现的顺序输出行,并且它一次只在内存中存储一行,因此无论输入文件有多大,它都能正常工作。