2012-04-03 98 views
-1

我有看起來像這樣一個文件:Linux的:加入兩行相等的值在同一文件

1 51 Brahui ACAAT
1 51 Brahui ACAGT
3 51 Brahui ACAGC
3 51 Brahui ACGAT
5 51 Brahui ACGAT
5 51 Brahui ACGGC
7 51 Brahui ACGAT
7 51 Brahui ACGGT
9 51 Brahui ACGGT
9 51 Brahui A C G G T

我想生成一個輸出文件,如果第一列/字段的值相等,那麼我想將兩行合併爲一個「/」字符作爲分隔符。例如:

1 51 Brahui A/AC/CA/AA/GT/T
3 51 Brahui A/AC/CA/GG/AC/T

有一種方法,我可以做到這一點?

P.S。從4美元起的列實際上是2,834美元(即$ 4-2841美元),所以我認爲實際輸入$ 4,$ 5,$ 6等是不實際的。有沒有辦法做到這一點?

+0

爲什麼第5列=「C/A」? – kev 2012-04-03 11:34:42

+0

你使用什麼編程語言? – 2012-04-03 16:20:21

+0

我一直希望能夠在Linux中使用shell終端來完成此操作。但我也可以使用Perl – 714 2012-04-04 08:21:00

回答

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> 
0

我喜歡用fmt。它使代碼更漂亮。

[[email protected] ~]$ 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; } 

[[email protected] ~]$ ./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 
[[email protected] ~]$ 
相關問題