Linux:在SAME文件中加入两行具有相等值的行

时间:2012-04-03 11:21:34

标签: linux join merge

我有一个看起来像这样的文件:

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美元等是不切实际的。有没有办法做到这一点?

2 个答案:

答案 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 ~]$