Bash 有选择地用空格和空格重新格式化文件\n
我有以下格式的多个文件。这一个有3个序列(所有文件中的序列数量不同,但始终以“.”结尾),每个序列有40个位置,如第一行中的数字所示。从行的开头(第一行除外)有序列的名称:Bash 有选择地用空格和空格重新格式化文件\n,bash,text-processing,Bash,Text Processing,我有以下格式的多个文件。这一个有3个序列(所有文件中的序列数量不同,但始终以“.”结尾),每个序列有40个位置,如第一行中的数字所示。从行的开头(第一行除外)有序列的名称: 3 40 00076284. ATGTCTGTGG TTCTTTAACC 00892634. TTGTCTGAGG TTCGTAAACC 00055673. TTGTCTGAGG TCCGTGAACC GCCGGGAACA TCCGCAAAAA ACCGTGAAAC GGGGT
3 40
00076284. ATGTCTGTGG TTCTTTAACC
00892634. TTGTCTGAGG TTCGTAAACC
00055673. TTGTCTGAGG TCCGTGAACC
GCCGGGAACA TCCGCAAAAA
ACCGTGAAAC GGGGTGAACT
TCCCCCGAAC TCCCTGAACG
我需要将其转换为这种格式,其中序列是连续的,没有空格nor\n,并且在其名称后的新行上。应该保留的唯一空格是第一行中两个数字之间的空格
3 40
00076284.
ATGTCTGTGGTTCTTTAACCGCCGGGAACATCCGCAAAAA
00892634.
TTGTCTGAGGTTCGTAAACCACCGTGAAACGGGGTGAACT
00055673.
TTGTCTGAGGTCCGTGAACCTCCCCCGAACTCCCTGAACG
尝试删除空格和\n,但不知道如何在第一行之后应用它,以及如何避免生成一个大行
谢谢我想这应该行得通,但我的输出会更长,因为如果我真的把最后的“孤立”序列都压缩了,我会得到更长的一行
cat input.txt | awk '/^[0-9]+ [0-9]+$/{printf("%s\n",$0); next} /[0-9]+[.]/{ printf("\n%s\n",$1);for(i=2; i<=NF;i++){printf("%s",$i)}; next} /^ */{ for(i=1; i<=NF;i++){printf("%s",$i)}; next;}'
3 40
cat input.txt | awk'/^[0-9]+[0-9]+$/{printf(“%s\n”,$0);next}/[0-9]+[.]/{printf(“\n%s\n”,$1”);for(i=2;i这里有一个shell脚本,可以提供您需要的内容:
head -1 input
awk '
NR == 1 { sequences = $1 ; positions = $2 ; next }
{
if ( $1 ~ /^[0-9]/ ) {
sid = $1 ; $1 = "" ; sequence_name[ NR - 1 ] = sid
sequence[ NR - 1 ] = $0
} else {
sequence[ ( NR - 1 ) % ( sequences + 1 ) ] = sequence[ (NR-1) % ( sequences + 1 ) ] " " $0
}
}
END {
for ( x = 1 ; x <= length( sequence_name ) ; x++ )
{
print sequence_name[x]
print sequence[x]
}
}' input | tr -d ' '
head-1输入
awk'
NR==1{序列=$1;位置=$2;下一个}
{
如果($1~/^[0-9]/){
sid=$1;$1=“”;序列名称[NR-1]=sid
序列[NR-1]=$0
}否则{
序列[(NR-1)%(序列+1)]=序列[(NR-1)%(序列+1)]”“$0
}
}
结束{
对于(x=1;x记住空行的位置,并将空行前的行与空行后的行合并:
awk '
NR==1{print;next}
NR!=1 && !empty{arr[NR]=$1 "\n" $2 $3}
/^$/{empty=NR-1;next}
NR!=1 && empty{printf "%s%s%s\n", arr[NR-empty], $1, $2}
' file
我的第二个解决方案没有awk
:使用空行作为分隔符将文件与其自身合并
cat >file <<EOF
3 40
00076284. ATGTCTGTGG TTCTTTAACC
00892634. TTGTCTGAGG TTCGTAAACC
00055673. TTGTCTGAGG TCCGTGAACC
GCCGGGAACA TCCGCAAAAA
ACCGTGAAAC GGGGTGAACT
TCCCCCGAAC TCCCTGAACG
EOF
head -n1 file
paste <(sed -n '1!{ /^$/q;p; }' file) <(sed -n '1!{ /^$/,//{/^$/!p}; }' file) |
sed 's/[[:space:]]//g; s/\./.\n/'
:
head-n1文件
输出第一行
sed-n'1!{/^$/q;p;}文件
1!
-不要输出第一行
/^$/q
-空行时退出
p
打印所有其他内容
sed-n'1!{/^$/,//{/^$/!p};}文件
1!
-忽略第一行
/^$/,//
-从空行到结尾
/^$/!p
-如果不是空的T行,则输出
粘贴输入的其余部分会发生什么?那里有三行会无缘无故地冒烟。最后三行会与其对应的序列合并。作为参考,您可以看到第一个合并序列以AAAAA结尾。唯一的细节是我需要第一行保持不变。您知道如何做吗?除了t、 很好的解决方案!就是这样。谢谢@Mark
3 40
00076284.
ATGTCTGTGGTTCTTTAACCGCCGGGAACATCCGCAAAAA
00892634.
TTGTCTGAGGTTCGTAAACCACCGTGAAACGGGGTGAACT
00055673.
TTGTCTGAGGTCCGTGAACCTCCCCCGAACTCCCTGAACG