首页 > 解决方案 > 有选择地重新格式化带有空格和 \n 的文件

问题描述

我有以下格式的多个文件。这个有 3 个序列(所有文件中的序列数不同,但总是以“.”结尾),每个序列有 40 个位置,如第一行中的数字所示。从行的开头(除了第一行)有序列的名称:

3 40
00076284. ATGTCTGTGG TTCTTTAACC 
00892634. TTGTCTGAGG TTCGTAAACC 
00055673. TTGTCTGAGG TCCGTGAACC 

          GCCGGGAACA TCCGCAAAAA
          ACCGTGAAAC GGGGTGAACT
          TCCCCCGAAC TCCCTGAACG

我需要将其转换为这种格式,其中序列是连续的,没有空格也没有 \n,并且在它们的名称之后的新行上。唯一应该保留的空格是在第一行的两个数字之间。

3 40
00076284. 
ATGTCTGTGGTTCTTTAACCGCCGGGAACATCCGCAAAAA
00892634. 
TTGTCTGAGGTTCGTAAACCACCGTGAAACGGGGTGAACT
00055673. 
TTGTCTGAGGTCCGTGAACCTCCCCCGAACTCCCTGAACG

尝试 sed 删除空格和 \n,但不知道如何在第一行之后应用它以及如何避免制作一个大行。

谢谢

标签: bashtext-processing

解决方案


这是一个可以提供您需要的 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 脚本中的第一行,因为到tr -d ' '.


推荐阅读