将4行合并为一行

时间:2016-01-05 13:49:30

标签: bash sed grep

我正在尝试转变此输入:

A----A----------A----A-A--AAAA
-CC----CCCC-C-----CCC-C-------C
------G----G--G--G------G------
---TT--------T-T---------T-----

进入以下输出:

ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC

我想为此使用bash。是否有特定的命令来执行此操作,还是需要编写实际的脚本?

5 个答案:

答案 0 :(得分:2)

一种可能的解决方案:

#!/bin/bash
line[1]="A----A----------A----A-A--AAAA-"
line[2]="-CC----CCCC-C-----CCC-C-------C"
line[3]="------G----G--G--G------G------"
line[4]="---TT--------T-T---------T-----"

lsize=${#line[1]}
out=""
for (( i=0; i<$lsize; i++ )) ; do
    for ((j=1; j<=4; j++ )) ; do
        c=${line[${j}]:${i}:1}
        if [ "$c" != "-" ] ; then
            out=${out}${c}
        fi
    done
done
echo $out

请注意,这假设输入格式正确 - 它没有错误检查! 您可能希望使用“read”或其他方式来获取四个输入字符串,例如:

#!/bin/bash
read line[1] < a.dat
read line[2] < c.dat
read line[3] < g.dat
read line[4] < t.dat
 ...

如果所有4行输入都在一个文件中,您可以重定向stdin并使用:

#!/bin/bash
read line[1]
read line[2]
read line[3]
read line[4]

答案 1 :(得分:1)

另一个没有错误检查(和循环)的脚本

$ fold -w1 file | pr -4t | sed 's/\s*-\s*//g' | tr -d '\n' | sed '$a\'

ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC

PS。您的第一行最后缺少-

另一个较短的替代方案

fold -w1 file | pr -4t | tr -d '\n\t\- ' | sed '$a\'

答案 2 :(得分:0)

的Perl

perl -ne '
    if ($. == 1) {$str = $_; next}
    for (my $i=0; $i<length($str); $i++) {
        substr($str,$i,1) = substr($_,$i,1) if substr($_,$i,1) =~ /[ACGT]/;
    } 
    END {print $str}
' file

awk中的相同程序

awk '
    NR == 1 {str = $0; next} 
    {
        for (i=1; i<=length($0); i++) 
            if (substr($0,i,1) ~ /[ACGT]/) 
                str = substr(str,1,i-1) substr($0,i,1) substr(str,i+1)
    } 
    END {print str}
' file

答案 3 :(得分:0)

如果第一行以payer_id order_number sum_units sum_value id_3rd_level order_date isCorporate payment tk 1725577 50090498 1 0.01 140000 2013-10-29 00:00:00.000 0 Cash 32200 结尾,则此awk命令应该适用于您:

-

使用您的数据进行测试:

awk 'NR==1{split($0,a,"");next}
    {delete b;split($0,b,"")
            for(i=1;i<=length(a);i++)if(a[i]=="-") a[i]=b[i]
    }
    END{for(i=1;i<=length(a);i++)printf "%s",a[i];print ""}' file

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;N;s/^/\n/;tb;:b;s/\n+$//;ta;s/\n-(.*\n)(.)/\2\n\1/;tb;s/\n(.)(.*\n)./\1\n\2/;tb' file

此解决方案取决于所有行长度相等,但它适用于任何数量的行。

在图案空间中收集两条线,并在第一条线的前面插入换行符。然后第一行中的每个字符与相同位置的第二行中的字符匹配,如果它是' - ',则交换它。但是,如果它不是' - ',它将被单独存在,下一个字符将被匹配,直到遇到每个字符为止(第二行被缩短为1,第一行中的位置被一个字符碰撞。剩下来匹配的是新行,然后删除换行符,如果存在另一行,则将其附加到当前行并重复该过程。