我有一个看起来像这样的文件:
1 51 Brahui A C A A T
1 51 Brahui A C A G T
3 51 Brahui A C A G C
3 51 Brahui A C G A T
5 51 Brahui A C G A T
5 51 Brahui A C G G C
7 51 Brahui A C G A T
7 51 Brahui A C G G T
9 51 Brahui A C G G T
9 51 Brahui A C G G T
我想生成一个输出文件,如果第一列/字段的值相等,那么我想将两行合并为一个“/”字符作为分隔符。例如:
1 51 Brahui A / A C / C A / A A / G T / T
3 51 Brahui A / A C / C A / G G / A C / T
我有办法做到这一点吗?
P.S从4美元开始的列实际上是2,834长(即4美元到2841美元),所以我认为实际输入4美元,5美元,6美元等是不切实际的。有没有办法做到这一点?答案 0 :(得分:0)
pearl.229>awk '{a=$1;
b=$4;
c=$5;
d=$6;
e=$7;
f=$8;
getline;
if(a==$1)
print a,$2,$3,b"/"$4,c"/"$5,d"/"$6,e"/"$7,f"/"$8}' file3
1 51 Brahui A/A C/C A/A A/G T/T
3 51 Brahui A/A C/C A/G G/A C/T
5 51 Brahui A/A C/C G/G A/G T/C
7 51 Brahui A/A C/C G/G A/G T/T
9 51 Brahui A/A C/C G/G G/G T/T
pearl.230>
答案 1 :(得分:0)
我喜欢使用fmt。它使代码更漂亮。
[ghoti@pc ~]$ cat doit
#!/usr/bin/awk -f
BEGIN {
fmt="%s %s %s %s/%s %s/%s %s/%s %s/%s %s/%s\n";
}
one == $1 {
split(last,a);
printf(fmt, $1,$2,$3, a[4],$4, a[5],$5, a[6],$6, a[7],$7, a[8],$8);
}
{ last = $0; one = $1; }
[ghoti@pc ~]$ ./doit input.txt
1 51 Brahui A/A C/C A/A A/G T/T
3 51 Brahui A/A C/C A/G G/A C/T
5 51 Brahui A/A C/C G/G A/G T/C
7 51 Brahui A/A C/C G/G A/G T/T
9 51 Brahui A/A C/C G/G G/G T/T
[ghoti@pc ~]$