Bash:将4个文件中的4行合并为一个文件

时间:2015-01-04 10:02:50

标签: bash dna-sequence

我正在寻找一种方法将4行dna探测结果合并为一行。

这里的问题是:

我不想追加这些台词。但关联他们

4行dna探测:

A----A----------A----A-A--AAAA-

-CC----CCCC-C-----CCC-C-------C

------G----G--G--G------G------

---TT--------T-T---------T-----

我需要这些是1行,不仅仅是附加,而是混合没有破折号。

结果的第一个字符:

 ACCTTAGCCCCGC...

这似乎是一种一般问题,所以选择解决这个问题的语言并不重要。

2 个答案:

答案 0 :(得分:2)

为了好玩:一个方式:

lines=(
    A----A----------A----A-A--AAAA-
    -CC----CCCC-C-----CCC-C-------C
    ------G----G--G--G------G------
    ---TT--------T-T---------T-----
)

result=""
for ((i=0;i<${#lines};i++)) ;do
    chr=- c=()
    for ((l=0;l<${#lines[@]};l++)) ;do
        [ "${lines[l]:i:1}" != "-" ] &&
            chr="${lines[l]:i:1}" &&
            c+=($l)
      done
    [ ${#c[@]} -eq 0 ] && printf 'Char #%d not replaced.\n' $i
    [ ${#c[@]} -gt 1 ] && c="${c[*]}" && chr="*" &&
         printf "Conflict at char #%d (lines: %s).\n" $i "${c// /, }"
    result+=$chr
  done
echo $result

使用提供的输入,没有冲突,所有字符都被替换。所以输出是:

ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC

注意:有4个不同文件的问题,因此lines=语法可能是:

lines=($(cat file1 file2 file3 file4))

但输入错误:

lines=(
    A----A---A-----A-----A-A--AAAA-
    -CC----CCCC-C-----CCC-C-------C
    ------G----G---G-G------G------
    ---TT--------T-T---------T-----
)

输出可能是:

Conflict at char #9 (lines: 0, 1).
Char #14 not replaced.
Conflict at char #15 (lines: 0, 2, 3).
Char #16 not replaced.

echo $result
ACCTTAGCC*CGCT-*-GCCCACAGTAAAAC

小型perl过滤器

但是如果要验证输入,这个小的perl过滤器可以完成这项工作: (感谢@ jm666 }{语法)

perl -nlE 'y+-+\0+;$,|=$_}{say$,' <(cat file1 file2 file3 file4)

,其中

-n          process all lines without output
-l          whipe leading cariage return at end of lines
y+lhs+rhs+  replace (translate) chars from 'lhs' to 'rhs'
\0          is the *null* character, binary 0.
$,          is a variable
|=          binary or, between himself and current line ($_)
}{          at END, once all lines processed

答案 1 :(得分:1)

替代方式 - 效率不高 - 但简短:

file="./gene"
line1=$(head -1 "$file")
seq ${#line1} | xargs -n1 -I% cut -c% "$file" | paste -s - | tr -cd '[A-Z\n]'

打印:

ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC

假设:每条线的长度相同。

分解:

  • line1=$(head -1 "$file")将第1行读入变量line1
  • seq ${#line1}生成一系列数字1 .. char_count_in_the_line1,如
1
2
..
31
  • xargs -n1 -I% cut -c% "$file"将针对cut之类的命令cut -c22 filename为每个上面的数字运行 - 从文件中提取给定的column,例如您将获得如下输出:
A
-
-
-

-
C
-
-

# and so on
  • paste -s -会将上述行与\t(标签)分隔符连接成一条长行,例如:
A   -   -   -   -   C   -   -   -   C   -   -   -   -   -   T ... etc...
  • 最后tr -cd '[A-Z\n]'删除了不是大写字符或换行符的所有内容,因此会得到最终的
ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC