我正在尝试转变此输入:
A----A----------A----A-A--AAAA
-CC----CCCC-C-----CCC-C-------C
------G----G--G--G------G------
---TT--------T-T---------T-----
进入以下输出:
ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC
我想为此使用bash。是否有特定的命令来执行此操作,还是需要编写实际的脚本?
答案 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,第一行中的位置被一个字符碰撞。剩下来匹配的是新行,然后删除换行符,如果存在另一行,则将其附加到当前行并重复该过程。