【问题标题】:Linux: Join two lines with an equal value in the SAME fileLinux:在 SAME 文件中连接具有相等值的两行
【发布时间】:2012-04-17 01:05:04
【问题描述】:

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

1 51 布拉惠 A C A A T
1 51 布拉惠 A C A G T
3 51 布拉惠 A C A G C
3 51 布拉惠 A C G A T
5 51 Brahui A C G A T
5 51 布拉惠 A C G G C
7 51 Brahui A C G A T
7 51 布拉惠 A C G G T
9 51 布拉惠 A C G G T
9 51 布拉惠 A C G G T

我想生成一个输出文件,如果第一列/字段的值相等,那么我想将两行合并在一起,并以“/”字符作为分隔符。例如:

1 51 Brahui A/A C/C A/A A/G T/T
3 51 布拉惠 A/A C/C A/G G/A C/T

有什么办法可以做到吗?

P.S.从 $4 开始的列实际上是 2,834 长(即 $4-$2841),所以我认为实际输入 $4、$5、$6 等是不切实际的。有没有办法做到这一点?

【问题讨论】:

  • 你使用什么编程语言?
  • 我希望我能够仅使用 Linux 中的 shell 终端来执行此操作。但我也可以使用 Perl

标签: linux join merge


【解决方案1】:

我喜欢使用 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 ~]$ 

【讨论】:

    【解决方案2】:
    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2012-06-17
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多